matthew Zhang

慢慢学习,慢慢进步!
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

SQL 2005加密数据方法

Posted on 2008-11-17 21:55  matthewZhang  阅读(407)  评论(0编辑  收藏  举报
  1 --示例一,使用证书加密数据. 
  2 
  3 --建立测试数据表 
  4 CREATE TABLE tb(ID int IDENTITY(1,1),data varbinary(8000)); 
  5 GO 
  6 --建立证书一,该证书使用数据库主密钥来加密 
  7 CREATE CERTIFICATE Cert_Demo1  
  8 WITH  
  9   SUBJECT=N'cert1 encryption by database master key'
 10   START_DATE='2008-01-01'
 11   EXPIRY_DATE='2008-12-31' 
 12 GO 
 13 
 14 --建立证书二,该证书使用密码来加密 
 15 CREATE CERTIFICATE Cert_Demo2 
 16   ENCRYPTION BY PASSWORD='liangCK.123' 
 17 WITH  
 18   SUBJECT=N'cert1 encrption by password'
 19   START_DATE='2008-01-01'
 20   EXPIRY_DATE='2008-12-31' 
 21 GO 
 22 
 23 --此时,两个证书已经建立完,现在可以用这两个证书来对数据加密 
 24 --在对表tb做INSERT时,使用ENCRYPTBYCERT加密 
 25 
 26 INSERT tb(data) 
 27   SELECT ENCRYPTBYCERT(CERT_ID(N'Cert_Demo1'),N'这是证书1加密的内容-liangCK');  --使用证书1加密 
 28 
 29 INSERT tb(data) 
 30   SELECT ENCRYPTBYCERT(CERT_ID(N'Cert_Demo2'),N'这是证书2加密的内容-liangCK');  --使用证书2加密 
 31 
 32 
 33 --ok.现在已经对数据加密保证了.现在我们SELECT看看 
 34 
 35 SELECT * FROM tb ; 
 36 
 37 --现在对内容进行解密显示. 
 38 --解密时,使用DECRYPTBYCERT 
 39 
 40 SELECT 证书1解密=CONVERT(NVARCHAR(50),DECRYPTBYCERT(CERT_ID(N'Cert_Demo1'),data)), 
 41        --使用证书2解密时,要指定DECRYPTBYCERT的第三个参数, 
 42        --因为在创建时,指定了ENCRYPTION BY PASSWORD. 
 43        --所以这里要通过这个密码来解密.否则解密失败 
 44        证书2解密=CONVERT(NVARCHAR(50),DECRYPTBYCERT(CERT_ID(N'Cert_Demo2'),data,N'liangCK.123')) 
 45 FROM tb ; 
 46 
 47 --我们可以看到,因为第2条记录是证书2加密的.所以使用证书1将无法解密.所以返回NULL 
 48 
 49 /* 
 50 证书1解密                                              证书2解密 
 51 -------------------------------------------------- -------------------------------------------------- 
 52 这是证书1加密的内容-liangCK                                 NULL 
 53 NULL                                               这是证书2加密的内容-liangCK 
 54 
 55 (2 行受影响) 
 56 */ 
 57 
 58 GO 
 59 
 60 --删除测试证书与数据表 
 61 DROP CERTIFICATE Cert_Demo1; 
 62 DROP CERTIFICATE Cert_Demo2; 
 63 DROP TABLE tb; 
 64 GO 
 65 
 66 
 67 --示例二,使用对称密钥加密数据, 
 68 --对称密钥又使用证书来加密. 
 69 
 70 --创建测试数据表tb 
 71 CREATE TABLE tb(ID int IDENTITY(1,1),data varbinary(8000)); 
 72 GO 
 73 
 74 --建立证书,该证书用于加密对称密钥. 
 75 
 76 CREATE CERTIFICATE Cert_Demo 
 77   ENCRYPTION BY PASSWORD=N'liangCK.123' 
 78 WITH 
 79   SUBJECT=N'cert encryption by password'
 80   START_DATE='2008-01-01'
 81   EXPIRY_DATE='2008-12-31' 
 82 GO 
 83 
 84 --建立对称密钥 
 85 
 86 CREATE SYMMETRIC KEY Sym_Demo 
 87 WITH 
 88    ALGORITHM=DES  --使用DES加密算法 
 89 ENCRYPTION BY CERTIFICATE Cert_Demo --使用Cert_Demo证书加密 
 90 GO  
 91 
 92 --要使用Sym_Demo对称密钥.必需使用OPEN SYMMETRIC KEY来打开它 
 93 
 94 OPEN SYMMETRIC KEY Sym_Demo 
 95    DECRYPTION BY CERTIFICATE Cert_Demo 
 96       WITH PASSWORD=N'liangCK.123' 
 97 
 98 --插入加密数据 
 99 
100 INSERT tb(data) 
101   SELECT ENCRYPTBYKEY(KEY_GUID(N'Sym_Demo'),N'这是加密的数据,能显示出来吗?'
102    
103 --关闭密钥 
104 CLOSE SYMMETRIC KEY Sym_Demo 
105 
106 --插入完加密数据,现在使用SELECT来查询一下数据 
107 
108 SELECT * FROM tb  
109 
110 GO 
111 
112 --现在来解密此数据 
113 
114 --同样,还是要先打开对称密钥 
115 
116 OPEN SYMMETRIC KEY Sym_Demo 
117    DECRYPTION BY CERTIFICATE Cert_Demo 
118       WITH PASSWORD=N'liangCK.123' 
119 
120 SELECT CONVERT(NVARCHAR(50),DECRYPTBYKEY(data)) --这里可见,数据已经解密出来了. 
121 FROM tb  
122 
123 CLOSE SYMMETRIC KEY Sym_Demo 
124 GO 
125 
126 --删除测试 
127 DROP SYMMETRIC KEY Sym_Demo 
128 DROP CERTIFICATE Cert_Demo 
129 DROP TABLE tb 
130 
131 
132 
133 --示例三,还有一种方法加密数据更简单 
134 --就是使用EncryptByPassPhrase 
135 
136 --建立测试数据表tb 
137 
138 CREATE TABLE tb(ID int IDENTITY(1,1),data varbinary(8000)); 
139 GO 
140 
141 INSERT tb(data) 
142   SELECT EncryptByPassPhrase(N'这是密码,用来加密的',N'这是要加密的内容'); 
143    
144 --解密 
145 
146 SELECT CONVERT(NVARCHAR(50),DECRYPTBYPASSPHRASE(N'这是密码,用来加密的',data)) 
147 FROM tb  
148 
149 GO 
150 DROP TABLE tb
151