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
-- 示例一, 使用证书加密数据.
-- 建立测试数据表
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
相关文章推荐
- 把一个用sql server 2005内置加密方法加密数据的DB从一台电脑备份后,还原到另外一台电脑上,出现的问题的处理办法
- SQL SERVER 2005 加密解密数据
- SQL Server 2005 数据加密
- SQL Server 2005: 如何让用户只能加密数据却不能解密数据
- SQL Server 2005对数据进行加密
- SQL Server 2005 数据加密
- SQL SERVER 2005中使用sql语句对xml 文件和其数据的进行操作(很全面)
- SQL Server 2005中如何跨库查询数据
- SQL Server 2005 常用数据类型详解【转载】
- SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据
- SQL Server(2005) 数据恢复--Log Explorer
- SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易
- sql server 2005中表的数据与excel互相导入导出的方法
- Sql Server 2005 如何利用AGENT代理 自动备份数据库
- 在SQL Server 2005数据库中更改数据架构
- SQL Server 2005中查询并修改数据的不合理设计
- sql server中如何对已经加密的数据进行解密?谢谢回答!!
- 如何在SQL Server 2005中用XQuery分解XML数据
- SQL Server 2005 中的商务智能和数据仓库(1)
- sql server 2005更改数据的登录用户名与访问权限