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