SQL数据加密与解密

 

 

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

 

-- 建立测试数据表

 

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

GO


--创建主密钥
create master key encryption by password='!@#$%^654321'

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


CREATE CERTIFICATE Cert_Demo1 

WITH 

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

  START_DATE = '2009-9-01' ,

    EXPIRY_DATE = '2009-12-31'

GO

 

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

CREATE CERTIFICATE Cert_Demo2

  ENCRYPTION BY PASSWORD = 'liangCK.123'

WITH 

  SUBJECT = N'cert1 encrption by password' ,

    START_DATE = '2009-01-01' ,

  EXPIRY_DATE = '2009-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 = '2009-01-01' ,

  EXPIRY_DATE = '2009-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

 

转载于:https://www.cnblogs.com/sharecxc/archive/2009/09/29/1576211.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值