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