博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER 2005数据加密
阅读量:4212 次
发布时间:2019-05-26

本文共 2873 字,大约阅读时间需要 9 分钟。

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

-- 建立测试数据表

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

转载地址:http://fgfmi.baihongyu.com/

你可能感兴趣的文章
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
SparkStreaming 如何保证消费Kafka的数据不丢失不重复
查看>>
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
Hive调优
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>
photoshop cc2019快捷键
查看>>