加密是指经过使用密钥或密码对数据进行模糊处理的过程。在SQL Server中,加密并不能替代其余的安全设置,好比防止未被受权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在的机房,而是做为当数据库被破解或是备份被窃取后的最后一道防线。经过加密,使得未被受权的人在没有密钥或密码的状况下所窃取的数据变得毫无心义。这种作法不只仅是为了你的数据安全,有时甚至是法律所要求的(像国内某知名IT网站泄漏密码这种事在中国能够道歉后不负任何责任了事,在米国妥妥的要破产清算)。html
在SQL Server2000和之前的版本,是不支持加密的。全部的加密操做都须要在程序中完成。这致使一个问题,数据库中加密的数据仅仅是对某一特定程序有意义,而另外的程序若是没有对应的解密算法,则数据变得毫无心义。算法
到了SQL Server2005,引入了列级加密。使得加密能够对特定列执行,这个过程涉及4对加密和解密的内置函数数据库
SQL Server 2008时代,则引入的了透明数据加密(TDE),所谓的透明数据加密,就是加密在数据库中进行,但从程序的角度来看就好像没有加密同样,和列级加密不一样的是,TDE加密的级别是整个数据库。使用TDE加密的数据库文件或备份在另外一个没有证书的实例上是不能附加或恢复的。安全
加密是指经过使用密钥或密码对数据进行模糊处理的过程。加密解密最简单的过程如图1所示。服务器
图1.一个简单的加密解密过程函数
一般来讲,加密能够分为两大类,对称(Symmetric)加密和非对称(Asymmetric)加密。性能
对称加密是那些加密和解密使用同一个密钥的加密算法,在图1中就是加密密钥=解密密钥。对称加密一般来讲会比较羸弱,由于使用数据时不只仅须要传输数据自己,仍是要经过某种方式传输密钥,这颇有可能使得密钥在传输的过程当中被窃取。测试
非对称加密是那些加密和解密使用不一样密钥的加密算法,在图1中就是加密密钥!=解密密钥。用于加密的密钥称之为公钥,用于解密的密钥称之为私钥。所以安全性相比对称加密来讲会大大提升。固然有一长必有一短,非对称加密的方式一般算法会相比对称密钥来讲复杂许多,所以会带来性能上的损失。网站
所以,一种折中的办法是使用对称密钥来加密数据,而使用非对称密钥来加密对称密钥。这样既能够利用对称密钥的高性能,还能够利用非对称密钥的可靠性。加密
如今流行的不少加密算法都是工业级的,好比对称加密的算法有:DES、3DES、IDEA、FEAL、BLOWFISH.而非对称加密的算法好比经典的RSA。由于这些算法已经公布了比较长的时间,而且经受了不少人的考验,因此一般来讲都是比较安全的。
SQL Server提供了好比:DES、Triple DES、TRIPLE_DES_3KEY、RC二、RC四、128 位 RC四、DESX、128 位 AES、192 位 AES 和 256 位 AES这些加密算法,没有某种算法能适应全部要求,每种算法都有长处和短处,关于每种加密算法的细节,请Bing…
但选择算法有一些共通之处:
强加密一般会比较弱的加密占用更多的 CPU 资源。
长密钥一般会比短密钥生成更强的加密。
非对称加密比使用相同密钥长度的对称加密更强,但速度相对较慢。
使用长密钥的块密码比流密码更强。
复杂的长密码比短密码更强。
若是您正在加密大量数据,应使用对称密钥来加密数据,并使用非对称密钥来加密该对称密钥。
不能压缩已加密的数据,但能够加密已压缩的数据。若是使用压缩,应在加密前压缩数据。
在SQL Server中,加密是分层级的.根层级的加密保护其子层级的加密。概念如图2所示。
图2.SQL Server加密的层级
由图2能够看出,加密是分层级的。每个数据库实例都拥有一个服务主密钥(Service Master Key),对应图2中的橙色部分。这个密钥是整个实例的根密钥,在实例安装的时候自动生成,其自己由Windows提供的数据保护API进行保护(Data Pertection API),服务主密钥除了为其子节点提供加密服务以外,还用于加密一些实例级别的信息,好比实例的登陆名密码或者连接服务器的信息。
在服务主密钥之下的是数据库主密钥(Database Master Key),也就是图2中土黄色的部分,这个密钥由服务主密钥进行加密。这是一个数据库级别的密钥。能够用于为建立数据库级别的证书或非对称密钥提供加密。每个数据库只能有一个数据库主密钥,经过T-SQL语句建立,如代码1所示。
代码1.建立数据库主密钥
数据库主密钥由代码1所示的密码和服务主密钥共同保护。当数据库主密钥建立成功后,咱们就可使用这个密钥建立对称密钥,非对称密钥和证书了。如代码2所示。
--建立证书
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
代码2.建立证书,非对称密钥和对称密钥
在代码2中咱们看出,并无显式指定使用数据库主密钥加密证书,对称密钥和非对称密钥。这是由于每一个数据库只能有一个数据库主密钥,因此无需指定。建立成功后咱们能够在SSMS中查看到刚刚建立的证书,非对称密钥和对称密钥,如图3所示。
图3.查看刚刚建立成功的证书,非对称密钥和对称密钥
由这个加密层级不难推断,若是数据库主密钥被破解,则由其所建立的证书,对称密钥,非对称密钥都有可能被破解。
由图2的层级咱们还能够看出,对称密钥不只仅能够经过密码建立,还能够经过其它对称密钥,非对称密钥和证书建立。如代码3所示。
--由证书加密对称密钥
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
代码3.由几种不一样的加密方式建立对称密钥
SQL Server在2005引入了列加密的功能。使得能够利用证书,对称密钥和非对称密钥对特定的列进行加密。在具体的实现上,根据加密解密的方式不一样,内置了4对函数用于加密解密:
所以,加密数据列使用起来相对比较繁琐,须要程序在代码中显式的调用SQL Server内置的加密和解密函数,这须要额外的工做量,而且,加密或解密的列首先须要转换成Varbinary类型。
下面咱们来看一个例子:
在AdventureWorks示例数据库中,咱们找到Sales.CreditCard表,发现信用卡号是明文显示的(怎么AdventureWorks也像泄漏密码的某IT网站这么没节操)。所以但愿对这一列进行加密。
图5.和国内某知名IT网站同样没节操的明文保存重要信息
首先咱们须要将CardNumber列转为Varbinary类型。这里经过Select Into新建个表,如代码4所示。
SELECT CreditCardID, CardType, CardNumber_encrypt = CONVERT(varbinary(500), CardNumber), ExpMonth, ExpYear, ModifiedDate INTO Sales.CreditCard_Encrypt FROM Sales.CreditCard WHERE 1<>1
代码4.经过Select Into建立新表
此时咱们利用以前建立的由证书加密的对称密钥来进行列加密,如代码5所示。
--打开以前建立的由证书加密的对称密钥
OPEN SYMMETRIC KEY SymmetricByCert
DECRYPTION BY CERTIFICATE CertTest
--利用这个密钥加密数据并插入新建的表 insert Sales.CreditCard_encrypt ( CardType, CardNumber_encrypt, ExpMonth, ExpYear, ModifiedDate ) select top 10 CardType, CardNumber_encrypt = EncryptByKey(KEY_GUID('SymmetricByCert'), CardNumber), ExpMonth, ExpYear, ModifiedDate from Sales.CreditCard
代码5.利用证书加密过的对称密钥加密数据
此时加密列没法直接进行查看,如图6所示:
图6.没法直接查看加密的列
此时能够经过对应的解密函数查看数据,如代码6所示。
OPEN SYMMETRIC KEY SymmetricByCert DECRYPTION BY CERTIFICATE CertTest select CardType, CardNumber = convert(nvarchar(25), DecryptByKey(CardNumber_encrypt)), ExpMonth, ExpYear, ModifiedDate from Sales.CreditCard_encrypt
图6.由对应的解密函数查看加密的数据
所获得的结果如图7所示。
图7.解密后结果能够正确显示
利用非对称密钥和证书进行加密解密只是函数不一样,这里就不测试了。
在SQL Server 2008中引入了透明数据加密(如下简称TDE),之因此叫透明数据加密,是由于这种加密在使用数据库的程序或用户看来,就好像没有加密同样。TDE加密是数据库级别的。数据的加密和解密是以页为单位,由数据引擎执行的。在写入时进行加密,在读出时进行解密。客户端程序彻底不用作任何操做。
TDE的主要做用是防止数据库备份或数据文件被偷了之后,偷数据库备份或文件的人在没有数据加密密钥的状况下是没法恢复或附加数据库的。
TDE使用数据加密密钥(DEK)进行加密。DEK是存在Master数据库中由服务主密钥保护,由的保护层级如图8所示。
图8.TDE的加密层次
开启TDE的数据库的日志和备份都会被自动加密。
由于TDE使得数据库在写入时加密,在读出时解密,所以须要额外的CPU资源,根据微软的说法,须要额外3%-5%的CPU资源。
下面咱们来看如何开启TDE
开启TDE很是简单,只需建立数据加密密钥(DEK)后,将加密选项开启就行,如代码7所示。
--基于咱们以前建立的证书CertTest,建立DEK
--CertTest须要在Master数据库中 USE AdventureWorks GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE CertTest GO --开启TDE ALTER DATABASE AdventureWorks SET ENCRYPTION ON
代码7.建立DEK后,开启TDE
这里值得注意的是,DEK是存在所开启TDE的数据库中的。固然,这个操做咱们也能够经过在SSMS中右键点击须要开始TDE的数据库,选择任务--管理数据库加密来进行。如图9所示。
图9.在SSMS中开启TDE
开启TDE后,咱们能够经过图10的语句查看TDE的状态。
图10.查看数据库加密状态
本文介绍了加密的基本概念,SQL Server中加密的层级,以及SQL Server中提供的两种不一样的加密方式。SQL Server的TDE是一个很是强大的功能,在用户程序中不作任何改变就能达到数据库层面的安全。在使用SQL Server提供的加密技术以前,必定要先对加密的各个功能概念有一个系统的了解,不然颇有可能形成的后果是打不开数据库。准备在后续文章中再写关于证书,密钥的备份和恢复….
转自:http://www.cnblogs.com/CareySon/archive/2012/04/01/2428780.html