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

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

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

2011-03-15 09:51 邀月 博客园 我要评论(0) 字号:T | T

http://blog.weirong.li/wp-content/uploads/2016/09/b68c7655-8245-425a-895d-7eef53903ab8

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

AD:

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

我们看一组例子:

示例一、创建对称密钥

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

创建对称密钥使用如下命令: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   

http://blog.weirong.li/wp-content/uploads/2016/09/2005977c-99a3-4c44-961c-03ecdf2d8169

  1. –不打开直接读取  
  2. SELECT CustomerID,PasswordHintQuestion,  
  3. CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer  
  4. FROM dbo.PWDQuestion  
  5. WHERE CustomerID = 12   
  6.  

http://blog.weirong.li/wp-content/uploads/2016/09/11685c80-55f9-4c7b-b3b8-73d3329f2913

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

这里有个问题,如果恶意用户不知道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. –打开对称密钥,连CustomerID列一起加密  
  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,–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,–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. –我们用刚才的CustomerID = 13的PasswordHintAnswer列值  
  3. –替换CustomerID = 14的PasswordHintAnswer列值,  
  4. –再用刚才读取14的方法读取真实值**********************************************************/  
  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,–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   

http://blog.weirong.li/wp-content/uploads/2016/09/29c7046f-a134-413a-8a01-8330a56e6cfa

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

示例五、删除对称密钥

命令: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

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