SQL Server 2016:全程加密

jopen 9年前發布 | 22K 次閱讀 SQL Server
 

關于數據庫的安全性,或者說關于安全性的缺失問題時常見諸報端。幾乎每個月都不只一次看到關于大企業或政府機構由于數據庫安全性問題而捅出大婁 子的報道。這些問題中的一部分是可以通過加密與散列技術得到緩解的,但由于這一過程很乏味,因此開發者通常只會對最敏感的數據應用這種技術,例如密碼等 等。

SQL Server 2016將通過新的 全程加密 (Always Encrypted)特性讓加密工作變得更簡單,這項特性提供了某種方式,以確保在數據庫中不會看到敏感列中的未加密值,并且無需對應用進行重寫。為了維持合理的性能,非敏感的列 —— 例如主鍵列仍將保持未加密。

實際的數據加密與解密過程是由數據庫driver這一層處理的,數據庫本身只能看到加密后的值,而應用程序代碼僅僅是與未加密的數據打交道。在 執行某個查詢時,driver會自動在Windows Certificate Store(或其它取決于操作系統中的位置)中查找主密鑰。該主密鑰將用于將對應于某一列的密鑰進行解密,隨后再用解密后的密鑰對字段及參數進行加密與解 密。

場景

微軟給出了使用全程加密的三種場景。

本地客戶端與數據

某客戶的客戶端應用與SQL Server都運行于本地的自有企業場所,他打算雇用一位外部人士進行SQL Server的管理。為了保護SQL Server中所存儲的機密數據,該客戶應用了全程加密這一特性,以確保數據庫管理員與應用程序管理員的職責分離。客戶將全程加密的密鑰以明文值的方式存 儲在某個可信的密鑰存儲系統中,這個系統是客戶端應用程序能夠訪問的,而SQL Server的管理員無法訪問這些密鑰,因此也無法解密存儲在SQL Server中的機密數據。

本地客戶端與Azure平臺中的數據

某客戶的客戶端應用運行在本地的自有企業場所中,該應用需要操作運行于Azure平臺上的某個數據庫(例如在Microsoft Azure的虛擬機中運行的SQL Server實例)中的機密數據。客戶利用了全程加密特性,將全程加密的密鑰存儲在一個可信的本地存儲系統中,以保證微軟云管理員無法訪問機密數據。

客戶端與數據都運行在Azure平臺

某客戶的客戶端應用運行在Microsoft Azure平臺上(例如某個在worker role或web role中運行),它需要操作同樣存儲在Microsoft Azure平臺上的機密數據。客戶利用全程加密特性以減少遭受安全攻擊的表面面積(機密數據在數據庫與運行該數據庫的機器中都保持全程加密)。

加密類型

SQL Server提供了兩種加密模式:確定型加密與隨機型加密。確定型加密能夠確保對某個值加密后的結果是始終相同的,這就允許使用者對該數據列進行等值比較、連接及分組操作。

確定型加密的缺點在于,它“允許未授權的用戶通過對加密列的模式進行分析,從而猜測加密值的相關信息”。在取值范圍較小的情況下,這一點會體現得尤為明顯。

為了提高安全性,應當使用隨機型加密。就像 對密碼進行salt 操作一樣,它能夠保證某個給定值在任意兩次加密后的結果總是不同的,從而杜絕了猜出原值的可能性。微軟進一步說明道:

對于會被當作搜索或分組參數的列應使用確定型加密,例如某個行政機構的ID值。而對于諸如機密研究的注解等數據應使用隨機型加密,這種數據不會用于與其它記錄進行分組,也不會用于表的連接。

通用的限制

如果某個列被加密,那么所有的范圍型操作都會被禁止,例如大于/小于或使用LIKE進行模式匹配等等。此外,你無法將加密的值傳遞給用戶自定義函數或其它函數,因為數據庫無法訪問未加密的值。

只有使用確定型加密的列才能夠進行等值比較。

只有使用確定型加密的列才能夠應用索引。

如果要對兩個列進行連接操作,那么這兩個列必須使用相同的列加密密鑰。

對應加密列的常量表達式是不允許的,打個比方,不可以編寫WHERE SSN = '111-11-1111'這樣的語句,但可以寫成WHERE SSN = @SSN。這是因為SQL Server驅動需要與SqlParameter類配合,才能夠處理加密方面的需求。

不支持加密的數據類型包括:xml、rowversion、image、ntext、text、sql_variant、hierarchyid、geography、geometry以及用戶自定義類型。

截至目前,.NET 4.6是唯一一個支持該特性的SQL Server driver。

查看英文原文: SQL Server 2016: Always Encrypted

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!