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