简述MSSQL加密体系
一、基础了解
1.加密的体制共有三种:证书、对称密钥、非对称密钥
2. M ssql加密体系是由这么几个层次组成的:
SQL Server 2005 用分层加密和密钥管理基础结构来加密数据。每一层都使用证书、非对称密钥和对称密钥的组合对它下面的一层进行加密。顶层(服务主密钥)是用 Windows DP API 加密的。 (摘自MSDN)
“ 每一层都使用证书、非对称密钥和对称密钥的组合对它下面的一层进行加密 ”。 怎么理解这句话呢?可以这样去理解:你设立的一个父节点的密钥,然后再为其设立子节点密钥时,这个子节点的密钥会被其父节点密钥加密;而不是要求必须从根节点开始设置密钥,一直设置到你需要的子节点,你完全可以直接从子节点设置密钥(过去有位朋友告诉我,加密需要从服务层到数据层都加密才行,这是错误的理解),给一个例子:
--建立一个对称密钥例子
create symmetric key myfirst with ALGORITHM = Aes_256 encryption by password = 'mypass$$word'
open symmetric key myfirst decryption by password = 'mypass$$word'
update dba . tb2 set b = encryptbykey ( key_guid ( 'myfirst' ), b )
--注意:open(解密对称密钥)这一步必须有,否则,当你使用update后会发现dba.tb2
--中的b列数据都会变成null
二、罗列备忘
1.数据库主密钥与证书可以使用backup,对称密钥与非对称密钥则没有backup;
2.password注意要符合os的加密策略;
3.证书中的 WITH SUBJECT 参数好像不能有标点符号,否则会提示:
Msg 15297, Level 16, State 1, Line 3
The certificate, asymmetric key, or private key data is invalid.
4.当先建立的证书,然后在证书下建立对称密钥,若你没有删除对称密钥而是直接删除证书则会提示这样的错误(GUI):
使用sql删除提示:
Msg 15352, Level 16, State 1, Line 1
The certificate cannot be dropped because one or more entities are either signed or encrypted using it.
5.设立数据库主密钥的方法
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'master##pas$sword'; --数据库密钥
6. 对称加密和解密速度相对较快,适于处理大量数据 ;非对称密钥次之;证书加密最消耗资源。
7.存储加密数据的列,注意列宽问题,建议使用max,否则被加密的列会被清空。
8.在加密与解密前需使用open解密密钥,若在加密前没有是open解密,则被加密的数据会更新为null值。
三、一个实例
create table test1 (
col1 nvarchar ( max ), -- 建议使用max,若列宽少于加密后值得宽度,则会变为null值
col2 nvarchar ( max ),
col3 nvarchar ( max )
)
insert into test1 values ( 'a' , 'b' ,null)
insert into test1 values ( 'b' , 'c' ,null)
--建立私有证书(使用自定义密码加密此证书)
CREATE CERTIFICATE Test1
ENCRYPTION BY PASSWORD = 'thisIsAP@$$w0rd' --密码必须符合复杂性策略
WITH SUBJECT = 'This is a test certificate' , --不能有标点符号
START_DATE = '1/1/2006' ,
EXPIRY_DATE = '12/31/2008' ;
go
--建立对称密钥并使用证书test1加密
create symmetric key myfirst with ALGORITHM = Aes_256 encryption by CERTIFICATE Test1
--解密对称密钥,若不解密而直接update,会发现数据被清空为null值
open symmetric key myfirst decryption by CERTIFICATE Test1 with password = 'thisIsAP@$$w0rd'
--为test1中col3加密,col3是明码
update test1 set col3 = encryptbykey ( key_guid ( 'myfirst' ), col3 )
--为test1中col3解密
open symmetric key myfirst decryption by CERTIFICATE Test1 with password = 'thisIsAP@$$w0rd'
select col1,col2,
convert ( varchar , DecryptByKey ( col 3 )) as 'col 3 '
from test1
四、总结
MSSQL2005在加密上下了功夫,但缺点也是有的,如在加密前没有使用open会使加密后的值变为null,却没有任何警告提示;在加密后的数据宽度超过存储宽度时也会将数据变为null,却没有任何警告提示。
http://www.windbi.com/showtopic-1058.aspx
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/715744/viewspace-206147/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/715744/viewspace-206147/