【转】简述MSSQL加密体系

 

简述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/

你可能感兴趣的:(【转】简述MSSQL加密体系)