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