代码3.由几种不同的加密方式创建对称密钥
SQL Server中的数据列加密(Column-level Encryption)
SQL Server在2005引入了列加密的功能。使得可以利用证书,对称密钥和非对称密钥对特定的列进行加密。在具体的实现上,根据加密解密的方式不同,内置了4对函数用于加密解密:
EncryptByCert() 和DecryptByCert()—利用证书对数据进行加密和解密
EncryptByAsymKey() and DecryptByAsymKey()—利用非对称密钥对数据进行加密和解密
EncryptByKey() and DecryptByKey()—利用对称密钥对数据进行加密和解密
EncryptByPassphrase() and DecryptByPassphrase()—利用密码字段产生对称密钥对数据进行加密和解密
因此,加密数据列使用起来相对比较繁琐,需要程序在代码中显式的调用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.解密后结果可以正确显示
利用非对称密钥和证书进行加密解密只是函数不同,这里就不测试了。
透明数据加密(Transparent Data Encryption)
在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提供的加密技术之前,一定要先对加密的各个功能概念有一个系统的了解,否则很有可能造成的后果是打不开数据库。准备在后续文章中再写关于证书,密钥的备份和恢复。
阅读(1776) | 评论(0) | 转发(0) |