项目安全审核过程中涉及到敏感信息加密的问题,收藏备用!
SQL Server中提供的两种不同的加密方式,可以分为两大类,对称(Symmetric)加密和非对称(Asymmetric)加密。
sqlserver 加密详细见
加密方法,例子见
注意的是使用 sqlserver 加密,字段属性需要是varbinary
SQL Server的对称加密示例代码:
--创建一个对称密钥,其实只需要创建一次,不用每次都创建,这个对称密钥密码为123456(嗯,大多数人认为的密码),密码是nvarchar类型的
CREATE SYMMETRIC KEY my_symetric_key WITH ALGORITHM = DESX ENCRYPTION BY PASSWORD = N'123456';
--使用一个对称密钥前必须打开它,而且要提供创建它时所使用的密码,密码不对的话就会打开失败
OPEN SYMMETRIC KEY my_symetric_key DECRYPTION BY PASSWORD = N'123456';
--只能加密字符串,如果要加密数字,就用CONVERT函数先把数字转为字符串
DECLARE @strClearText NVARCHAR(100);
SET @strClearText = N'3000.00';
--密文类型为VARBINARY,用
DECLARE @strCipherText VARBINARY(MAX);
SET @strCipherText = EncryptByKey(Key_GUID('my_symetric_key'), @strClearText);
--显示密文(密文其实为二进制格式,你会看到其HEX文本)
SELECT @strCipherText AS [密文];
--解密不需要提供密钥名称,SQL Server会根据当前上下文去寻找打开的对称密钥
DECLARE @strDecrypted VARBINARY(MAX);
SET @strDecrypted = DecryptByKey(@strCipherText);
--显示出解密后的明文
SELECT Convert(NVARCHAR(100), @strDecrypted) AS [解密后的明文]
--关闭这个密钥
CLOSE SYMMETRIC KEY my_symetric_key;
--以后还需要用这个密钥的话就不用删掉它
DROP SYMMETRIC KEY my_symetric_key;
SQL Server的非对称加密示例代码:
--创建一个非对称密钥(不用每次都创建),这个对称密钥密码为123456,使用RSA512算法,另外还有RSA1024和RSA2048,强度更高,可加密内容更长,密钥生成速度也会慢不少,RSA512这里足够用了
CREATE ASYMMETRIC KEY my_asymetric_key WITH ALGORITHM = RSA_512 ENCRYPTION BY PASSWORD = N'123456';
DECLARE @strClearText NVARCHAR(100);
SET @strClearText = N'3000.00';
--加密,和对称加密不一样,不需要提供密码,也不需要打开密钥
DECLARE @strCipherText VARBINARY(MAX);
SET @strCipherText = EncryptByAsymKey(AsymKey_ID('my_asymetric_key'), @strClearText);
--显示密文
SELECT @strCipherText AS [密文];
--解密,必须提供生成密钥时候的密码,密码不正确的话就会出错
--密钥选择不正确的话会得到NULL结果
DECLARE @strDecrypted VARBINARY(MAX);
SET @strDecrypted = DecryptByAsymKey(AsymKey_ID('my_asymetric_key'), @strCipherText, N'123456');
--显示出解密后的明文
SELECT Convert(NVARCHAR(100), @strDecrypted) AS [解密后的明文]
--以后还需要用这个密钥的话就不用删掉它
DROP ASYMMETRIC KEY my_Asymetric_key;
--查看所有对称密钥
SELECT * FROM sys.symmetric_keys;
--查看所有非对称密钥
SELECT * FROM sys.asymmetric_keys;
例子:
--创建一个非对称密钥
CREATE ASYMMETRIC KEY salary_mgr_key
WITH ALGORITHM = RSA_512
ENCRYPTION BY PASSWORD = N'123456';
--加密
insert into table(id, value1) values('1', EncryptByAsymKey(AsymKey_ID('salary_mgr_key'), Convert(nvarchar(100),8000.00)), 0);
--解密
select id , Convert( nvarchar (100 ), DecryptByAsymKey (AsymKey_ID ( 'salary_mgr_key'), value1, N'123456'))as value1 from table