浅析SQL Server 2008中的代码安全之六:对称密钥加密

【说明】 本文转载自:http://database.51cto.com/art/201103/249081.htm

浅析SQL Server 2008中的代码安全之六:对称密钥加密

证书和非对称密钥使用数据库级的内部公钥加密数据,并且使用数据库级内部私钥解密数据。而对称密钥相对简单,它们包含一个同时用来加密和解密的密钥。困此,使用对称密钥加密数据更快,并且用在大数据时更加合适。尽管复杂度是考虑使用它的因素,但它仍然是一个很好的加密数据的选择。

证书和非对称密钥使用数据库级的内部公钥加密数据,并且使用数据库级内部私钥解密数据。而对称密钥相对简单,它们包含一个同时用来加密和解密的密钥。困此,使用对称密钥加密数据更快,并且用在大数据时更加合适。尽管复杂度是考虑使用它的因素,但它仍然是一个很好的加密数据的选择。

我们看一组例子:

示例一、创建对称密钥

对称密钥的特性是:在数据库会话中使用它对数据进行加密和解密前必须首先打开。

创建对称密钥使用如下命令:CREATE SYMMETRIC KEY  创建对称密钥。(http://msdn.microsoft.com/en-us/library/ms188357.aspx)

  1. use DB_Encrypt_Demo  

  2. go  

  3.  

  4. CREATE ASYMMETRIC KEY symDemoKey   

  5. WITH ALGORITHM = RSA_512       

  6. ENCRYPTION BY PASSWORD = 'TestSYM456!'  

  7.  

  8. CREATE SYMMETRIC KEY sym_Demo  

  9. WITH ALGORITHM = TRIPLE_DES  

  10. ENCRYPTION BY ASYMMETRIC KEY symDemoKey  

  11.  

示例二、查看当前数据库中的对称密钥

使用目录视图sys.symmetric_keys(http://msdn.microsoft.com/en-us/library/ms189446.aspx)来查看。

  1.  

  2. use DB_Encrypt_Demo  

  3. go  

  4. SELECT name, algorithm_desc FROM sys.symmetric_keys  

  5.  

  6. /*  

  7. name    algorithm_desc  

  8. sym_Demo    TRIPLE_DES  

  9. */  

  10.  

示例三、修改非对称密钥的加密方式

你可以使用ALTER SYMMETRIC KEY(http://technet.microsoft.com/en-us/library/ms189440.aspx)命令修改对称密钥的加密方式。但执行前必须使用OPEN SYMMETRIC KEY(http://msdn.microsoft.com/en-us/library/ms190499.aspx)命令打开它。

  1. use DB_Encrypt_Demo  

  2. go  

  3.  

  4. OPEN SYMMETRIC KEY sym_Demo  

  5. DECRYPTION BY ASYMMETRIC KEY symDemoKey  

  6. WITH PASSWORD = 'TestSYM456!' 

  7.  

  8. ALTER SYMMETRIC KEY sym_Demo  

  9. ADD ENCRYPTION BY PASSWORD = 'newnew!456' 

  10.  

  11. ALTER SYMMETRIC KEY sym_Demo  

  12. DROP ENCRYPTION BY ASYMMETRIC KEY symDemoKey  

  13.  

  14. CLOSE SYMMETRIC KEY sym_Demo    

示例四、使用对称密钥对数据进行加密和解密。

1、为了使用对称密钥对数据进行加密,必须首先打开它,然后使用函数EncryptByKey 加密数据。(http://msdn.microsoft.com/zh-cn/library/ms174361.aspx)

2、使用DecryptByKey来解密使用对称密钥加密的数据。注意DecryptByKey不像甩EncryptByKey,无须使用对称密钥GUID。因此,为了解密,必须打开正确的对称密钥会话,否则会显示null。

下面是一个例子:

  1. /***************************************************/  

  2. USE DB_Encrypt_Demo  

  3. GO  

  4.  

  5. CREATE TABLE dbo.PWDQuestion  

  6. (CustomerID int NOT NULL PRIMARY KEY,  

  7. PasswordHintQuestion nvarchar(300) NOT NULL,  

  8. PasswordHintAnswer varbinary(200) NOT NULL)  

  9. GO  

  10.  

  11. OPEN SYMMETRIC KEY sym_Demo  

  12. DECRYPTION BY PASSWORD = 'newnew!456' 

  13. INSERT dbo.PWDQuestion  

  14. (CustomerID, PasswordHintQuestion, PasswordHintAnswer)  

  15. VALUES 

  16. (12, '您出生的医院名称?',  

  17. EncryptByKey(Key_GUID('sym_Demo '), '杭州市一'))  

  18. CLOSE SYMMETRIC KEY sym_Demo  

  19.  

查看未加密的数据: 

  1. OPEN SYMMETRIC KEY sym_Demo  

  2. DECRYPTION BY PASSWORD = 'newnew!456' 

  3. SELECT CustomerID,PasswordHintQuestion,  

  4. CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer  

  5. FROM dbo.PWDQuestion  

  6. WHERE CustomerID = 12  

  7.  

  8. CLOSE SYMMETRIC KEY sym_Demo   

  1.  

  2. SELECT CustomerID,PasswordHintQuestion,  

  3. CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer  

  4. FROM dbo.PWDQuestion  

  5. WHERE CustomerID = 12   

  6.  

至此,好像已经大功告成了,别,千万别高兴得太早!

这里有个问题,如果恶意用户不知道CustomerID=13的PasswordHintAnswer列的真实值,但知道CustomerID=14的PasswordHintAnswer列的真实值,则完全可以通过恶意替换PasswordHintAnswer列而绕过加密!!此时,我们索性连CustomerID列作为验证列也一起加密,以绝后患 !

注意:加密的验证列也可以由另一个相关表的列作为参数传入。

看一个完整的例子:

  1. truncate table dbo.PWDQuestion  

  2. go  

  3.  

  4. INSERT dbo.PWDQuestion  

  5. (CustomerID, PasswordHintQuestion, PasswordHintAnswer)  

  6. select 13, '您出生的医院名称?',cast('浙江妇保院' as varbinary)  

  7. union all 

  8. select  14, '您出生的医院名称?',cast('浙江妇保二院' as varbinary)  

  9.  

  10. OPEN SYMMETRIC KEY sym_Demo  

  11. DECRYPTION BY PASSWORD = 'newnew!456' 

  12. UPDATE dbo.PWDQuestion  

  13. SET PasswordHintAnswer =  

  14. EncryptByKey(Key_GUID('sym_Demo'),  

  15. PasswordHintAnswer,1,  

  16. CAST(CustomerID as varbinary))  

  17. WHERE CustomerID in (13,14)  

  18.  

  19. CLOSE SYMMETRIC KEY sym_Demo  

  20.  

  21. OPEN SYMMETRIC KEY sym_Demo  

  22. DECRYPTION BY PASSWORD = 'newnew!456' 

  23. SELECT CustomerID,PasswordHintQuestion,  

  24. CAST(DecryptByKey(PasswordHintAnswer, 1,  

  25. CAST(CustomerID as varbinary)) as varchar(200)) PasswordHintAnswer  

  26. FROM dbo.PWDQuestion  

  27. WHERE CustomerID = 13  

  28.  

  29. CLOSE SYMMETRIC KEY sym_Demo   

  30.  

恶意替换开始:

  1. /**********************************************************  

  2.  

  3.  

  4.  

  5. update dbo.PWDQuestion set PasswordHintAnswer=  

  6. (select PasswordHintAnswer from   dbo.PWDQuestion where CustomerID = 14)  

  7. where CustomerID = 13  

此时,我们再查看:

  1. OPEN SYMMETRIC KEY sym_Demo  

  2. DECRYPTION BY PASSWORD = 'newnew!456' 

  3. SELECT CustomerID,PasswordHintQuestion,  

  4. CAST(DecryptByKey(PasswordHintAnswer, 1,  

  5. CAST(CustomerID as varbinary)) as varchar(200))   

  6. PasswordHintAnswer,PasswordHintAnswer as binaryValue  

  7. FROM dbo.PWDQuestion  

  8. WHERE CustomerID in(13,14)  

  9.  

  10. CLOSE SYMMETRIC KEY sym_Demo   

郎勒个郎!爽吧!虽然复制了相同的二进制数据,可是读取结果令攻击者大失所望啊!

示例五、删除对称密钥

命令:DROP SYMMETRIC KEY 删除指定的对称密钥( http://technet.microsoft.com/en-us/library/ms182698.aspx)

例子:

  1. DROP SYMMETRIC KEY symDemoKey  

注意:如果加密密钥打开没有关闭,则drop失败。

小结:

1、本文主要介绍对称密钥的创建、删除、查看以及用它来修改加密方式、进行数据的加密和解密。

2、对称密钥的特性是:在数据库会话中使用它对数据进行加密和解密前必须首先打开。

3、对称密钥可用于大数据的加密。

下文将主要介绍证书加密(Certificate Encryption)

原文链接:http://www.cnblogs.com/downmoon/archive/2011/03/15/1984352.html

此条目发表在未分类分类目录,贴了标签。将固定链接加入收藏夹。