加密是指通过使用密钥或密码对数据进行模糊处理的过程。在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在的机房,而是作为当数据库被破解或是备份被窃取后的最后一道防线。通过加密,使得未被授权的人在没有密钥或密码的情况下所窃取的数据变得毫无意义。这种做法不仅仅是为了你的数据安全,有时甚至是法律所要求的(像国内某知名IT网站泄漏密码这种事在中国可以道歉后不负任何责任了事,在米国妥妥的要破产清算)。
加密是指通过使用密钥或密码对数据进行模糊处理的过程。加密解密最简单的过程如图1所示。
现在流行的很多加密算法都是工业级的,比如对称加密的算法有:DES、3DES、IDEA、FEAL、BLOWFISH.而非对称加密的算法比如经典的RSA。因为这些算法已经公布了比较长的时间,并且经受了很多人的考验,所以通常来说都是比较安全的。
-
强加密通常会比较弱的加密占用更多的 CPU 资源。 -
长密钥通常会比短密钥生成更强的加密。 -
非对称加密比使用相同密钥长度的对称加密更强,但速度相对较慢。 -
使用长密钥的块密码比流密码更强。 -
复杂的长密码比短密码更强。 -
如果您正在加密大量数据,应使用对称密钥来加密数据,并使用非对称密钥来加密该对称密钥。 -
不能压缩已加密的数据,但可以加密已压缩的数据。如果使用压缩,应在加密前压缩数据。
在SQL Server中,加密是分层级的.根层级的加密保护其子层级的加密。概念如图2所示。
CREATE MASTER KEY ENCRYPTION BY PASSWORD ="Pa$$word"
--创建证书CREATE CERTIFICATE CertTest with SUBJECT = "Test Certificate"GO--创建非对称密钥CREATE ASYMMETRIC KEY TestAsymmetric WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = "pa$$word"; GO--创建对称密钥CREATE SYMMETRIC KEY TestSymmetric WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = "pa$$word";GO
--由证书加密对称密钥CREATE SYMMETRIC KEY SymmetricByCert WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE CertTest;GO--由对称密钥加密对称密钥OPEN SYMMETRIC KEY TestSymmetric DECRYPTION BY PASSWORD="pa$$word"CREATE SYMMETRIC KEY SymmetricBySy WITH ALGORITHM = AES_256 ENCRYPTION BY SYMMETRIC KEY TestSymmetric;GO--由非对称密钥加密对称密钥CREATE SYMMETRIC KEY SymmetricByAsy WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY TestASymmetric;GO
SQL Server在2005引入了列加密的功能。使得可以利用证书,对称密钥和非对称密钥对特定的列进行加密。在具体的实现上,根据加密解密的方式不同,内置了4对函数用于加密解密:
-
EncryptByCert() 和DecryptByCert()—利用证书对数据进行加密和解密 -
EncryptByAsymKey() and DecryptByAsymKey()—利用非对称密钥对数据进行加密和解密 EncryptByKey() and DecryptByKey()—利用对称密钥对数据进行加密和解密 -
EncryptByPassphrase() and DecryptByPassphrase()—利用密码字段产生对称密钥对数据进行加密和解密
SELECT CreditCardID, CardType,CardNumber_encrypt = CONVERT(varbinary(500), CardNumber), ExpMonth, ExpYear, ModifiedDateINTO Sales.CreditCard_Encrypt FROM Sales.CreditCard WHERE 1<>1
--打开之前创建的由证书加密的对称密钥OPEN SYMMETRIC KEY SymmetricByCertDECRYPTION BY CERTIFICATE CertTest--利用这个密钥加密数据并插入新建的表insert Sales.CreditCard_encrypt (CardType,CardNumber_encrypt, ExpMonth, ExpYear, ModifiedDate) select top 10CardType,CardNumber_encrypt = EncryptByKey(KEY_GUID("SymmetricByCert"), CardNumber),ExpMonth,ExpYear, ModifiedDatefrom Sales.CreditCard
OPEN SYMMETRIC KEY SymmetricByCertDECRYPTION BY CERTIFICATE CertTestselect CardType,CardNumber = convert(nvarchar(25), DecryptByKey(CardNumber_encrypt)), ExpMonth, ExpYear, ModifiedDatefrom Sales.CreditCard_encrypt
在SQL Server 2008中引入了透明数据加密(以下简称TDE),之所以叫透明数据加密,是因为这种加密在使用数据库的程序或用户看来,就好像没有加密一样。TDE加密是数据库级别的。数据的加密和解密是以页为单位,由数据引擎执行的。在写入时进行加密,在读出时进行解密。客户端程序完全不用做任何操作。
--基于我们之前创建的证书CertTest,创建DEK--CertTest需要在Master数据库中USE AdventureWorksGO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE CertTestGO--开启TDEALTER DATABASE AdventureWorksSET ENCRYPTION ON
本文介绍了加密的基本概念,SQL Server中加密的层级,以及SQL Server中提供的两种不同的加密方式。SQL Server的TDE是一个非常强大的功能,在用户程序中不做任何改变就能达到数据库层面的安全。在使用SQL Server提供的加密技术之前,一定要先对加密的各个功能概念有一个系统的了解,否则很有可能造成的后果是打不开数据库。准备在后续文章中再写关于证书,密钥的备份和恢复….
End.
作者:宋沄剑
本文为转载分享,如果涉及作品、版权和其他问题,请联系我们第一时间删除(微信号:lovedata0520)
- 我的微信公众号
- 微信扫一扫
- 我的微信公众号
- 微信扫一扫
评论