sql中几个数据加密的方法

IF OBJECT_ID('test') IS  NOT NULL DROP TABLE dbo.test
go
--创建测试表
CREATE TABLE test ( userid INT IDENTITY(1,1),userName VARCHAR(10),userPassword  VARCHAR(20),EncryptPwd VARCHAR(max))
--测试数据
INSERT INTO dbo.test
SELECT '张三','123456',NULL  UNION ALL
SELECT '李四','312432',NULL  UNION ALL
SELECT '王五','4fds56',NULL
--1.通过Convert改变编码方式,变为varbinary(可变长的二进制数据),不具备数据保护能力
SELECT userid,userName,CONVERT(VARBINARY(max),userpassword) FROM dbo.test
/*
userid      userName   
----------- ---------- -----------------------
1           张三         0x313233343536
2           李四         0x313233343536
3           王五         0x313233343536

(3 行受影响)
*/
--1.对称密钥:利用EncryptByKey函数进行加密,DecryptByKey函数进行解密,比较适合大量数据
/*
各个参数的详情Sql server 帮助文档
可以在sys.symmetric_keys目录视图中查看对称密钥的有关信息
select * from sys.symmetric_keys

*/
--创建对称密钥
CREATE SYMMETRIC KEY SymKey
WITH ALGORITHM=TRIPLE_DES --TRIPLE_DES具有128位的密钥的算法
ENCRYPTION BY 
PASSWORD='P@ssw0rd' --用来保护密钥的密码,password 必须符合运行 SQL Server 实例的计算机的密码策略要求。应始终使用强密码
go
--注意事项:在启用时,需要先OPEN SYMMETRIC KEY 搭配密钥密码,否则所产生的数据都会是null值。而且需要搭配Key_GUID函数来使用
--打开对称密钥
OPEN SYMMETRIC KEY SymKey DECRYPTION BY PASSWORD='P@ssw0rd'
--进行数据加密
SELECT *,ENCRYPTBYKEY(KEY_GUID('SymKey'),CONVERT(VARCHAR(max),userPassword)) AS newPwd FROM dbo.test
--把加密后的数据更新到另外一列上
UPDATE dbo.test  SET EncryptPwd=ENCRYPTBYKEY(KEY_GUID('SymKey'),CONVERT(VARCHAR(max),userPassword))
--加密后的结果
/*
userid      userName   userPassword         加密后的密码
----------- ---------- -------------------- ------------------------------------------------
1           张三         123456                簜?-J价?Q/御   誚A(?-d?9r?螈nrR?            
2           李四         123456                簜?-J价?Q/御   ??獁D?p.g?倘x錷Y?             
3           王五         123456                簜?-J价?Q/御   櫟伥q@滟?&[绠鱒f@肱             

(3 行受影响)
*/
--解密
OPEN SYMMETRIC KEY SymKey DECRYPTION BY PASSWORD='P@ssw0rd'
SELECT *,CONVERT(VARCHAR(max),CONVERT(VARCHAR(MAX),DECRYPTBYKEY(EncryptPwd))) AS 解密后的密码 
FROM dbo.test 
/*
userid      userName   userPassword         EncryptPwd                                          解密后的密码
----------- ---------- -------------------- --------------------------------------------------------------------------------
1           张三         123456                簜?-J价?Q/御   誚A(?-d?9r?螈nrR?            123456
2           李四         123456                簜?-J价?Q/御   ??獁D?p.g?倘x錷Y?              123456
3           王五         123456                簜?-J价?Q/御   櫟伥q@滟?&[绠鱒f@肱         123456

(3 行受影响)
*/
--2.非对称密钥:非对称密钥使用两种不同的密钥,所以加密是是不需要输入密码验证,但解密时就需要
--详情Sql server 帮助文档
go
CREATE ASYMMETRIC KEY AsyKey
WITH Algorithm=RSA_2048 ENCRYPTION BY PASSWORD='P@ssw0rd'
GO
--添加一列,用来存储非对称密钥加密后的数据
ALTER TABLE dbo.test
ADD EncryptByAsyKey VARCHAR(512)
GO
--进行加密
SELECT *,ENCRYPTBYASYMKEY(ASYMKEY_ID('AsyKey'),CONVERT(VARCHAR(max),userPassword))
FROM dbo.test
go
--把数据更新到一个新列
UPDATE dbo.test SET EncryptByAsyKey=ENCRYPTBYASYMKEY(ASYMKEY_ID('AsyKey'),CONVERT(VARCHAR(max),userPassword))
go
--进行解密
SELECT userid,userName,EncryptByAsyKey,
CONVERT(VARCHAR(max),CONVERT(VARCHAR(MAX),DECRYPTBYASYMKEY(ASYMKEY_ID('AsyKey'),EncryptByAsyKey,N'P@ssw0rd'))) AS 解密后的密码
FROM dbo.test

--3.证书加密:一个数据库级安全对象,创建方式有A. 创建自我签名的证书B. 通过文件创建证书C. 通过已签名的可执行文件创建证书
--详情参考Sql server 技术文档
--建立证书
CREATE CERTIFICATE certKey				--证书名
ENCRYPTION BY PASSWORD='P@ssw0rd'		--证书密码
WITH SUBJECT='Password certificate',	--证书描述	
START_DATE= '2012/06/25',				--证书生效期
EXPIRY_DATE= '2013/06/25';				--证书截至期
GO
--添加一列,用来存储利用证书加密后的密码
ALTER TABLE dbo.test 
ADD EncryptByCerkey VARCHAR(max)
--利用证书加密
SELECT *,ENCRYPTBYCERT(CERT_ID('certKey'),CONVERT(VARCHAR(max),userpassword)) 
FROM dbo.test
UPDATE dbo.test SET EncryptByCerkey=ENCRYPTBYCERT(CERT_ID('certKey'),CONVERT(VARCHAR(max),userpassword))
SELECT * FROM dbo.test
--解密
SELECT userid,username,EncryptByCerkey,
CONVERT(VARCHAR(max),DECRYPTBYCERT(CERT_ID('certKey'),EncryptByCerkey,N'P@ssw0rd')) AS 解密后的密码
FROM dbo.test

--5.短语加密
--该过程较为简单,只需要使用EncryptByPassPhrase函数,使用短语加密时,参考的数据航不可以变动,否则解密失败。
--添加一列用来存储短语加密后的密码
ALTER TABLE dbo.test
ADD EncryptByPass VARCHAR(MAX)
go
--进行加密
SELECT *,ENCRYPTBYPASSPHRASE(N'P@ssw0rd',CONVERT(VARBINARY,userpassword),userid)
FROM dbo.test
UPDATE dbo.test SET EncryptByPass=ENCRYPTBYPASSPHRASE(N'P@ssw0rd',CONVERT(VARBINARY,userpassword),userid)
SELECT * FROM dbo.test
--解密
SELECT userid,userName,EncryptByPass,
CONVERT(VARCHAR(max),DECRYPTBYPASSPHRASE(N'P@ssw0rd',EncryptByPass,userid)) AS 解密后的密码
FROM dbo.test

原文地址:https://www.cnblogs.com/hailiang2013/p/2846422.html