Sql Server數(shù)據(jù)庫實現(xiàn)表中字段的列加密
1、問題描述
去年6月份的時候做過一個系統(tǒng),要對里面的一些敏感字段進行一下加密。Sqlserver列加密可以參考官方文檔:SQL Server 技術(shù)文檔 - SQL Server | Microsoft Learn。主要看下來有三種加密方法:1、利用證書對數(shù)據(jù)進行加密和解密。2、利用非對稱密鑰對數(shù)據(jù)進行加密和解密。3、利用對稱密鑰對數(shù)據(jù)進行加密和解密。
2、加密方法介紹
2.1、證書加密(推薦)
2.1.1、創(chuàng)建證書
use mydb; --查看數(shù)據(jù)庫中的證書 select * from sys.certificates; --創(chuàng)建數(shù)據(jù)庫主密鑰 CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123@#456'; --創(chuàng)建證書 CREATE CERTIFICATE MyCert with SUBJECT = 'My Test Certificate' GO --創(chuàng)建證書并授權(quán)給指定用戶(zhangsan) CREATE CERTIFICATE MyCertToZhangSan AUTHORIZATION zhangsan with SUBJECT = 'My Test Certificate To ZhangSan' GO
2.1.2、使用證書加解密
創(chuàng)建一個測試表
--創(chuàng)建測試表TUser_test_Cert,要對pwd字段進行加密因此其字段類型設(shè)為varbinary --varbinary表示可變長度二進制數(shù)據(jù),但是在sqlserver表存放是以十六進制存的。 create table TUser_test_Cert(username varchar(50),pwd varbinary(2000));
在2.1.1環(huán)節(jié)一共建了兩個證書,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數(shù)據(jù)庫進行證書加解密嘛!因此首先要確保mydb下是否有zhangsan這個用戶!有了zhangsan這個用戶才能創(chuàng)建證書并對其AUTHORIZATION

有個地方要提一下,這里的zhangsan這個用戶是在mydb下的,并不是直接在mydb下直接手動創(chuàng)建的,而是整個sqlserver登錄名zhangsan映射到mydb的一個用戶映射!

其實就是在你新建數(shù)據(jù)庫登錄名的時候做的一個用戶映射,相當(dāng)于授權(quán)這個登錄名可以有哪些數(shù)據(jù)庫的權(quán)限了!

不過此時mydb新加的zhangsan這個用戶還沒有給他分配角色(所謂角色就是權(quán)限集合)
--創(chuàng)建一個角色zhangsan_role create role zhangsan_role; --給zhangsan_role這個角色分配TUser_test_Cert表的增刪改查權(quán)限 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、非對稱密鑰加解密
----利用非對稱密鑰對數(shù)據(jù)進行加密和解密---
--查看數(shù)據(jù)庫中的非對稱密鑰
select * from sys.asymmetric_keys;
--創(chuàng)建非對稱密鑰
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、對稱密鑰加解密
----利用對稱密鑰對數(shù)據(jù)進行加密和解密----
--查看數(shù)據(jù)庫中的對稱密鑰
select * from sys.symmetric_keys;
--創(chuàng)建對稱密鑰
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_Cert3、總結(jié)
Sqlserver數(shù)據(jù)庫列字段加密推薦使用證書加密,使用證書加密是對特定的賬號授予他們使用證書加解密的權(quán)限,他們只是用了證書的cert_id,并不會涉及password密鑰。但如果使用其他方法加密的話,比如AES,RSA的話,那么在加解密的時候會把密鑰暴露給開發(fā)人員


所以就不太安全!用證書的話就不會把密碼暴露給開發(fā)人員,只暴露給特定的賬戶!
4、參考資料
創(chuàng)建數(shù)據(jù)庫主密鑰 - SQL Server | Microsoft Learn
SQL Server 數(shù)據(jù)庫對稱加密_QAQ_的博客-CSDN博客
AES加密算法的詳細介紹與實現(xiàn)_TimeShatter的博客-CSDN博客_aes
SQLSERVER加密解密函數(shù)(非對稱密鑰 證書加密 對稱密鑰)_weixin_33877092的博客-CSDN博客
獲取所有用戶名 sql server_jgwei的博客-CSDN博客_sqlserver 查看數(shù)據(jù)庫所有用戶名
[轉(zhuǎn)]【SQLServer】獲取SQL Server數(shù)據(jù)庫用戶名、數(shù)據(jù)庫名、所有表名、所有字段名_liujzss的博客-CSDN博客
SQL Server 創(chuàng)建登錄名和用戶名【詳細介紹】_Henry_626的博客-CSDN博客_sqlserver新建登錄名
到此這篇關(guān)于Sql Server數(shù)據(jù)庫實現(xiàn)表中字段的列加密的文章就介紹到這了,更多相關(guān)Sql 列加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vs code連接sql server數(shù)據(jù)庫步驟及遇到的問題小結(jié)
這篇文章主要介紹了用vs code連接sql server數(shù)據(jù)庫步驟及遇到的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Linux安裝ODBC連接SQLServer數(shù)據(jù)庫的步驟
這篇文章主要介紹了Linux安裝ODBC連接SQLServer數(shù)據(jù)庫?,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
強制SQL Server執(zhí)行計劃使用并行提升在復(fù)雜查詢語句下的性能
最近在給一個客戶做調(diào)優(yōu)的時候發(fā)現(xiàn)一個很有意思的現(xiàn)象,對于一個復(fù)雜查詢(涉及12個表)建立必要的索引后,語句使用的IO急劇下降,但執(zhí)行時間不降反升,由原來的8秒升到20秒。2014-07-07
sqlserver四舍五入使用round函數(shù)及cast和convert函數(shù)
大家在遇到sqlserver四舍五入除了用round函數(shù)還有沒有其他方法呢?下面小編給大家介紹使用cast和convert函數(shù),感興趣的朋友一起學(xué)習(xí)吧2015-11-11

