Sql Server数据库实现表中字段的列加密

 更新时间:2023年10月24日 10:06:36   作者:金斗潼关  
本文主要介绍了Sql Server数据库实现表中字段的列加密,主要包括利用证书对数据进行加密和解密,利用非对称密钥对数据进行加密和解密,利用对称密钥对数据进行加密和解密,感兴趣的可以了解一下

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新建登录名

到此这篇关于Sql Server数据库实现表中字段的列加密的文章就介绍到这了,更多相关Sql 列加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • sql中COALESCE函数的使用小结

    sql中COALESCE函数的使用小结

    COALESCE函数用于从其参数列表中返回第一个非NULL值,本文主要介绍了sql中COALESCE函数的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • vs code连接sql server数据库步骤及遇到的问题小结

    vs code连接sql server数据库步骤及遇到的问题小结

    这篇文章主要介绍了用vs code连接sql server数据库步骤及遇到的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • SQL 将一列拆分成多列的三种方法

    SQL 将一列拆分成多列的三种方法

    这篇文章主要介绍了SQL 将一列拆分成多列的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • SQL SERVER数据操作类代码

    SQL SERVER数据操作类代码

    跟大家分享个SQL Server数据操作类,主要是操作数据库有关。请做适当修改
    2012-06-06
  • mysql与mssql的md5加密语句

    mysql与mssql的md5加密语句

    mysql与mssql的md5加密语句,需要的朋友可以参考一下
    2013-03-03
  • Linux安装ODBC连接SQLServer数据库的步骤

    Linux安装ODBC连接SQLServer数据库的步骤

    这篇文章主要介绍了Linux安装ODBC连接SQLServer数据库 ,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • SQL Server备份数据库的完整步骤

    SQL Server备份数据库的完整步骤

    备份是指对SQL Server数据库或事务日志进行的复制,下面这篇文章主要给大家介绍了关于SQL Server备份数据库的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • SQL SERVER临时表排序问题的解决方法

    SQL SERVER临时表排序问题的解决方法

    这篇文章主要给大家介绍了关于SQL SERVER临时表排序问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

    强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

    最近在给一个客户做调优的时候发现一个很有意思的现象,对于一个复杂查询(涉及12个表)建立必要的索引后,语句使用的IO急剧下降,但执行时间不降反升,由原来的8秒升到20秒。
    2014-07-07
  • sqlserver四舍五入使用round函数及cast和convert函数

    sqlserver四舍五入使用round函数及cast和convert函数

    大家在遇到sqlserver四舍五入除了用round函数还有没有其他方法呢?下面小编给大家介绍使用cast和convert函数,感兴趣的朋友一起学习吧
    2015-11-11

最新评论