您的位置:首页 > 数据库

SQL SERVER 2005数据加密 .

2011-09-16 16:02 375 查看
--Author: liangCK 小梁

-- 示例一, 使用证书加密数据.

-- 建立测试数据表

CREATE TABLE tb(ID int IDENTITY (1,1),data varbinary (8000));

GO

-- 建立证书一, 该证书使用数据库主密钥来加密

CREATE CERTIFICATE Cert_Demo1

WITH

SUBJECT = N'cert1 encryption by database master key' ,

START_DATE = '2008-01-01' ,

EXPIRY_DATE = '2008-12-31'

GO

-- 建立证书二, 该证书使用密码来加密

CREATE CERTIFICATE Cert_Demo2

ENCRYPTION BY PASSWORD = 'liangCK.123'

WITH

SUBJECT = N'cert1 encrption by password' ,

START_DATE = '2008-01-01' ,

EXPIRY_DATE = '2008-12-31'

GO

-- 此时, 两个证书已经建立完, 现在可以用这两个证书来对数据加密

-- 在对表tb 做INSERT 时, 使用ENCRYPTBYCERT 加密

INSERT tb(data)

SELECT ENCRYPTBYCERT ( CERT_ID ( N'Cert_Demo1' ), N' 这是证书1 加密的内容-liangCK' ); -- 使用证书1 加密

INSERT tb(data)

SELECT ENCRYPTBYCERT ( CERT_ID ( N'Cert_Demo2' ), N' 这是证书2 加密的内容-liangCK' ); -- 使用证书2 加密

--ok. 现在已经对数据加密保证了. 现在我们SELECT 看看

SELECT * FROM tb ;

-- 现在对内容进行解密显示.

-- 解密时, 使用DECRYPTBYCERT

SELECT 证书1 解密 = CONVERT ( NVARCHAR (50), DECRYPTBYCERT ( CERT_ID ( N'Cert_Demo1' ),data)),

-- 使用证书2 解密时, 要指定DECRYPTBYCERT 的第三个参数,

-- 因为在创建时, 指定了ENCRYPTION BY PASSWORD.

-- 所以这里要通过这个密码来解密. 否则解密失败

证书2 解密

= CONVERT ( NVARCHAR (50), DECRYPTBYCERT ( CERT_ID ( N'Cert_Demo2' ),data, N'liangCK.123' ))

FROM tb ;

-- 我们可以看到, 因为第2 条记录是证书2 加密的. 所以使用证书1 将无法解密. 所以返回NULL

/*

证书1 解密 证书2 解密

-------------------------------------------------- --------------------------------------------------

这是证书1 加密的内容-liangCK NULL

NULL 这是证书2 加密的内容-liangCK

(2 行受影响)

*/

GO

-- 删除测试证书与数据表

DROP CERTIFICATE Cert_Demo1;

DROP CERTIFICATE Cert_Demo2;

DROP TABLE tb;

GO

-- 示例二, 使用对称密钥加密数据,

-- 对称密钥又使用证书来加密.

-- 创建测试数据表tb

CREATE TABLE tb(ID int IDENTITY (1,1),data varbinary (8000));

GO

-- 建立证书, 该证书用于加密对称密钥.

CREATE CERTIFICATE Cert_Demo

ENCRYPTION BY PASSWORD = N'liangCK.123'

WITH

SUBJECT = N'cert encryption by password' ,

START_DATE = '2008-01-01' ,

EXPIRY_DATE = '2008-12-31'

GO

-- 建立对称密钥

CREATE SYMMETRIC KEY Sym_Demo

WITH

ALGORITHM=DES -- 使用DES 加密算法

ENCRYPTION BY CERTIFICATE Cert_Demo -- 使用Cert_Demo 证书加密

GO

-- 要使用Sym_Demo 对称密钥. 必需使用OPEN SYMMETRIC KEY 来打开它

OPEN SYMMETRIC KEY Sym_Demo

DECRYPTION BY CERTIFICATE Cert_Demo

WITH PASSWORD = N'liangCK.123'

-- 插入加密数据

INSERT tb(data)

SELECT ENCRYPTBYKEY ( KEY_GUID ( N'Sym_Demo' ), N' 这是加密的数据, 能显示出来吗?' )

-- 关闭密钥

CLOSE SYMMETRIC KEY Sym_Demo

-- 插入完加密数据, 现在使用SELECT 来查询一下数据

SELECT * FROM tb

GO

-- 现在来解密此数据

-- 同样, 还是要先打开对称密钥

OPEN SYMMETRIC KEY Sym_Demo

DECRYPTION BY CERTIFICATE Cert_Demo

WITH PASSWORD = N'liangCK.123'

SELECT CONVERT ( NVARCHAR (50), DECRYPTBYKEY (data)) -- 这里可见, 数据已经解密出来了.

FROM tb

CLOSE SYMMETRIC KEY Sym_Demo

GO

-- 删除测试

DROP SYMMETRIC KEY Sym_Demo

DROP CERTIFICATE Cert_Demo

DROP TABLE tb

-- 示例三, 还有一种方法加密数据更简单

-- 就是使用EncryptByPassPhrase

-- 建立测试数据表tb

CREATE TABLE tb(ID int IDENTITY (1,1),data varbinary (8000));

GO

INSERT tb(data)

SELECT EncryptByPassPhrase ( N' 这是密码, 用来加密的' , N' 这是要加密的内容' );

-- 解密

SELECT CONVERT ( NVARCHAR (50), DECRYPTBYPASSPHRASE ( N' 这是密码, 用来加密的' ,data))

FROM tb

GO

DROP TABLE tb
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: