1、问题描述
去年6月份的时候做过一个薪酬系统,要对里面的一些敏感字段进行一下加密。Sqlserver列加密可以参考官方文档:SQL Server 技术文档 - SQL Server | Microsoft Learn。主要看下来有三种加密方法:1、利用证书对数据进行加密和解密。2、利用非对称密钥对数据进行加密和解密。3、利用对称密钥对数据进行加密和解密。
2、加密方法介绍
2.1、证书加密(推荐)
2.1.1、创建证书
use mydb;
--查看数据库中的证书
select * from sys.certificates;
--创建数据库主密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123@#456';
--创建证书
CREATE CERTIFICATE MyCert
with SUBJECT = 'My Test Certificate'
GO
--创建证书并授权给指定用户(zhangsan)
CREATE CERTIFICATE MyCertToZhangSan AUTHORIZATION zhangsan
with SUBJECT = 'My Test Certificate To ZhangSan'
GO
2.1.2、使用证书加解密
创建一个测试表
--创建测试表TUser_test_Cert,要对pwd字段进行加密因此其字段类型设为varbinary
--varbinary表示可变长度二进制数据,但是在sqlserver表存放是以十六进制存的。
create table TUser_test_Cert(username varchar(50),pwd varbinary(2000));
在2.1.1环节一共建了两个证书,MyCert这个证书是公用的,而MyCertToZhangSan这个证书是仅限zhangsan这个用户可以使用!
使用MyCert证书加解密
--使用MyCert证书加密pwd字段
insert into TUser_test_Cert(username,pwd) values('liming',
ENCRYPTBYCERT(
CERT_ID('MyCert')
,'112233'
)
);
select * from TUser_test_Cert;
--使用MyCert证书解密pwd字段
select username,CONVERT(
varchar(100),
DecryptByCert
(
CERT_ID('MyCert'),pwd
)
) as pwd from TUser_test_Cert;
使用MyCertToZhangSan证书进行加解密
因为我是对mydb数据库进行证书加解密嘛!因此首先要确保mydb下是否有zhangsan这个用户!有了zhangsan这个用户才能创建证书并对其AUTHORIZATION
有个地方要提一下,这里的zhangsan这个用户是在mydb下的,并不是直接在mydb下直接手动创建的,而是整个sqlserver登录名zhangsan映射到mydb的一个用户映射!
其实就是在你新建数据库登录名的时候做的一个用户映射,相当于授权这个登录名可以有哪些数据库的权限了!
不过此时mydb新加的zhangsan这个用户还没有给他分配角色(所谓角色就是权限集合)
--创建一个角色zhangsan_role
create role zhangsan_role;
--给zhangsan_role这个角色分配TUser_test_Cert表的增删改查权限
grant select,update,insert,delete on TUser_test_Cert to zhangsan_role;
在mydb里用户选择zhangsan右键属性,在成员身份里选中zhangsan_role就行了!
--使用MyCertToZhangSan证书加密pwd字段
insert into TUser_test_Cert(username,pwd) values('zhangsan',
ENCRYPTBYCERT(
CERT_ID('MyCertToZhangSan')
,'666333'
)
);
select * from TUser_test_Cert;
--使用MyCert证书解密pwd字段
select username,CONVERT(
varchar(100),
DecryptByCert
(
CERT_ID('MyCertToZhangSan'),pwd
)
) as pwd from TUser_test_Cert;
2.2、非对称密钥加解密
----利用非对称密钥对数据进行加密和解密---
--查看数据库中的非对称密钥
select * from sys.asymmetric_keys;
--创建非对称密钥
CREATE ASYMMETRIC KEY MyTestAsymmetric
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = '%^&123%456';
GO
insert into TUser_test_Cert(username,pwd) values('ssan',
EncryptByAsymKey(
ASYMKEY_ID('MyTestAsymmetric')
,'112233'
)
);
select * from TUser_test_Cert;
select username,CONVERT(
varchar(100),
DecryptByAsymKey
(
ASYMKEY_ID('MyTestAsymmetric'),pwd,N'%^&123%456'
)
) as pwd from TUser_test_Cert;
2.3、对称密钥加解密
----利用对称密钥对数据进行加密和解密----
--查看数据库中的对称密钥
select * from sys.symmetric_keys;
--创建对称密钥
CREATE SYMMETRIC KEY MyTestSymmetric
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = '123456@aes';
GO
--打开密钥并进行加密/解密(只有对称加密需打开密钥!!!)
open symmetric key MyTestSymmetric decryption by password='123456@aes';
insert into TUser_test_Cert(username,pwd) values('qianqian',
EncryptByKey(Key_GUID('MyTestSymmetric'), 'qw123sa')
);
select * from TUser_test_Cert;
select username,CONVERT(
varchar(100),
DECRYPTBYKEY(pwd)
) as pwd from TUser_test_Cert
3、总结
Sqlserver数据库列字段加密推荐使用证书加密,使用证书加密是对特定的账号授予他们使用证书加解密的权限,他们只是用了证书的cert_id,并不会涉及password密钥。但如果使用其他方法加密的话,比如AES,RSA的话,那么在加解密的时候会把密钥暴露给开发人员
所以就不太安全!用证书的话就不会把密码暴露给开发人员,只暴露给特定的账户!
4、参考资料
创建数据库主密钥 - SQL Server | Microsoft Learn
通俗易懂的对称加密与非对称加密原理浅析 - 掘金
SQL Server 数据库对称加密_QAQ_的博客-CSDN博客
AES加密算法的详细介绍与实现_TimeShatter的博客-CSDN博客_aes
SQLSERVER加密解密函数(非对称密钥 证书加密 对称密钥)_weixin_33877092的博客-CSDN博客
获取所有用户名 sql server_jgwei的博客-CSDN博客_sqlserver 查看数据库所有用户名
[转]【SQLServer】获取SQL Server数据库用户名、数据库名、所有表名、所有字段名_liujzss的博客-CSDN博客
SQL Server 创建登录名和用户名【详细介绍】_Henry_626的博客-CSDN博客_sqlserver新建登录名