SQL Server如何防止開(kāi)發(fā)人員獲取敏感數(shù)據(jù)
朋友們,我們?cè)谑褂肧QLServer數(shù)據(jù)庫(kù)的時(shí)候,數(shù)據(jù)庫(kù)表的字段值都是公開(kāi)的。如果您是項(xiàng)目負(fù)責(zé)人,知道所有實(shí)際數(shù)據(jù)無(wú)可厚非,但如果這些數(shù)據(jù)比較敏感,您并不希望開(kāi)發(fā)團(tuán)隊(duì)的其他人員知道該怎么辦呢?
在上一篇《SQL Server如何進(jìn)行元數(shù)據(jù)底層加密》中,我詳細(xì)說(shuō)明了SQL Server數(shù)據(jù)加密用到的各種SQL語(yǔ)法,這一講我們結(jié)合實(shí)例實(shí)戰(zhàn)一下對(duì)數(shù)據(jù)庫(kù)字段進(jìn)行加密的方法和過(guò)程。
比如您是項(xiàng)目負(fù)責(zé)人,要給客戶開(kāi)發(fā)一個(gè)工資系統(tǒng)。一般企業(yè)的工資都是保密的,如果您直接把工資信息都明文放在數(shù)據(jù)庫(kù)中,您的開(kāi)發(fā)團(tuán)隊(duì)的每個(gè)人都很容易知道客戶員工的工資。如果客戶是個(gè)大企業(yè),這其中的風(fēng)險(xiǎn)我不說(shuō)您應(yīng)該也很清楚。
我們就以最簡(jiǎn)化的工資表為例,說(shuō)明如何對(duì)敏感信息進(jìn)行加密。如果您對(duì)加密用到的SQL語(yǔ)法不是很了解,建議您可以先回頭看看我上一篇的相關(guān)描述。
***步,創(chuàng)建數(shù)據(jù)庫(kù)主密鑰
- CREATE MASTER KEY ENCRYPTION BY PASSWORD ='SysKey'
- GO
這里創(chuàng)建了數(shù)據(jù)庫(kù)主密鑰,比如密碼是'SysKey'。主密鑰只需要?jiǎng)?chuàng)建一次。
第二步,創(chuàng)建證書(shū)
- CREATE CERTIFICATE MYCERT
- with SUBJECT = 'My Cert'
- GO
這里創(chuàng)建了證書(shū)MYCERT,證書(shū)的元數(shù)據(jù)中的字段為'My Cert'。證書(shū)創(chuàng)建一次,以后解密時(shí)需要先Open。
第三步,創(chuàng)建對(duì)稱(chēng)密鑰
- CREATE SYMMETRIC KEY MYKEY
- WITH ALGORITHM = AES_256
- ENCRYPTION BY CERTIFICATE MYCERT;
- GO
這里基于證書(shū)MYCERT創(chuàng)建了密鑰MYKEY,加密算法為AES_256。加密算法有好幾種。
前三步做完之后,我們可以在資源管理器中看到我們的證書(shū)和密鑰信息,如下圖所示:
第四步:加密解密有效性測(cè)試
我們先通過(guò)變量測(cè)試加密解密的有效性:
- OPEN SYMMETRIC KEY MYKEY DECRYPTION BY CERTIFICATE MYCERT;
- declare @key varbinary(MAX);
- set @key=EncryptByKey(key_guid('MYKEY'),'20000.00');
- select @key;
- select convert(varchar(100), DecryptByKey(@key));
在解密之前,要先打開(kāi)我們定義的密鑰,通過(guò):
- OPEN SYMMETRIC KEY NCSK DECRYPTION BY CERTIFICATE NCSC;
這句打開(kāi)密鑰,如果不先打開(kāi)密鑰,返回的將會(huì)是NULL。
運(yùn)行參考結(jié)果參考下圖:
第五步,準(zhǔn)備使用的數(shù)據(jù)
為了描述方便,我們創(chuàng)建一個(gè)工資表變量:
- declare @Salary table(
- FName nvarchar(50),
- FSalary varbinary(MAX));
這里要注意,存放加密數(shù)據(jù)的字段要設(shè)置成varbinary類(lèi)型。
第六步,插入加密數(shù)據(jù)
插入時(shí),要使用函數(shù)EncryptByKey對(duì)文本進(jìn)行加密,通過(guò)函數(shù)key_guid獲取密鑰,加密后的數(shù)據(jù)類(lèi)型為varbinary。
- insert into @Salary(FName,FSalary)
- values
- ('張三',EncryptByKey(key_guid('MYKEY'),'20000.00')),
- ('李四',EncryptByKey(key_guid('MYKEY'),'25000.00')),
- ('王二',EncryptByKey(key_guid('MYKEY'),'30000.00'));
第七步:數(shù)據(jù)讀取
讀取數(shù)據(jù)時(shí)需要調(diào)用函數(shù)DecryptByKey解密,通過(guò)Convert將解密后的Varbinary轉(zhuǎn)換成varchar類(lèi)型。
- select *,convert(varchar, DecryptByKey(FSalary)) from @Salary;
完整的處理請(qǐng)參考下圖:
怎么樣,整個(gè)過(guò)程不復(fù)雜吧。希望對(duì)您有所幫助!