数据库管理:SQL Server 2008安全性探讨
Ruby 发表于:12年09月06日 11:18 [转载] DOIT.com.cn
加密数据
并不是每一种数据类型都可以使用EncryptByKey函数加密。有效的数据类型是nvarchar、char、wchar、varchar和 nchar。表或视图中常备查询的列不应加密,因为解密大量会被一再查询的数据的过程通常会得不偿失。加密数据之前,必须打开将执行加密过程的密钥。数据通常手对称密钥保护,而对称密钥又受到非对称密钥对保护。如果对称密钥手密码保护,那么对对称密钥和密码有ALTER 权限的用户都可以打开和关闭对称密钥。如果对称密钥由一个非对称密钥或证书保护,用户还需要拥有对非对称密钥或证书上的CONTROL权限
- ALTER TABLE Sales.CreditCard ADD EncryptedCardNumber varbinary(128); GO
- OPEN SYMMETRIC KEY SalesKey1 DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD='P@ssw0rd'
- UPDATE Sales.CreditCard SET EncryptedCardNumber=EncryptByKey(Key_GUID('SalesKey1'),CardNumber); GO CLSE SYMMETRIC KEY SalesKey1; GO
- ALTER TABLE Sales.CreditCard ADD DecryptedCardNumber NVARCHAR(25); GO
- OPEN SYMMETRIC KEY SalesKey1 DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD='P@ssw0rd'; GO
- UPDATE Sales.CreditCard SET DecryptedCardNumber=DecryptByKey(EncryptedCardNumber); GO
- CLOSE SYMMETRIC KEY SalesKey1; GO
- Select TOP(10) CreditCardID, CardNumber AS Original, EncryptedCardNumber AS Encrypted, DecryptedCardnumber AS Decrypted FROM Sales.CreditCard; GO
不过,可以在SELECT语句中至此那个DecryptByKey函数来查看为加密的数据
- OPEN SYMMETRIC KEY SalesKey1 DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD='P@ssw0rd'; GO
- SELECT CreditCardID, CardNumber, EncryptedCardNumber AS 'Encrypted Card Number', CONVERT(nvarchar, DecryptByKey(EncryptedCardNumber))
- AS 'Decrypted Card Number' FROM Sales.CreditCard; GO
- CLOSE SYMMETRIC KEY SalesKey1;
透明数据加密
SQL Server 2008的另一项新工能是透明数据加密(TDE,Transparent Data Encryption)。TDE被设计为针对启用了TDE的数据库或事务日志文件,使用数据库加密密钥(DEK,Database Encryption Key)执行实时IO加密。TDE的好处是它保护处于休眠状态的所有数据。这意味着当前未读入内存的数据都是用DEK保护。不过,当查询运行时,从查询检索的数据将在被读入内存时解密。与使用对称和非对称密钥解密单个表或列中的数据不同,在读或写受TDE保护的数据库中的表时,不必调用解密函数。
设置TDE比其他加密方法要复杂些,因为在启用它之前有一些条件必须满足:首先,master数据库中必须有一个数据库主密钥;其次,必须在 master数据库中创建或安装一个可用于加密DEK的证书,或者可以使用EKM提供程序的非对称密钥;然后,需要在将加密的数据库中创建DEK,最后,在数据库中启用加密。
- USE master CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyStrongP@ssw0rd'; GO
- CREATE CERTIFICATE AughtEightTDE WITH SUBJECT='TDE Certificate for the AUGHTEIGHT Server'; GO
- USE AdventureWorks2008 CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM=TRIPLE_DES_3KEY ENCRYPTION BY SERVER CERTIFICATE AughtEightTDE; GO
- ALTER DATABASE AdventureWorks2008 SET ENCRYPTION ON; GO