如何在SQL Server資料庫中加密資料
為了防止某些別有用心的人從外部存取資料庫,盜取資料庫中的使用者姓名、密碼、信用卡號等其他重要訊息,在我們建立資料庫驅動的解決方案時,我們首先需要考慮的的第一條設計決策就是如何加密儲存資料,以此來保證它的安全,免受被他人窺測。
SQL Server中有哪一種支援可以用於加密對象和資料?從一開始就討論一下SQL Server欠缺什麼是明智的,或者是對於SQL Server中的加密部分你不應該做什麼。
首先,SQL Server有兩個內建的密碼函數——即,pwdencrypt() 和 pwdcompare()。同時,還有兩個SQL Server用來管理密碼雜湊的沒有正式記錄的函數:pwdencrypt() 將密碼雜湊過後進行儲存; pwdcompare()將提供的字串與雜湊後的字串進行比較。不幸的是,這個雜湊函數不是非常安全,它可以通過字典攻擊演算法被破解(類似命令列應用程式!)。
這些函數隨著SQL Server的版本發展而不斷進行修改,這也是另一個沒有使用它們的原因。早期版本的SQL Server對密碼進行的雜湊,在後來的版本中無法解密,所以如果你依賴一個版本中的函數,那麼當升級的時候,所有你的加密資料就都沒有用了,除非你可以首先對其解密——這也就違背了加密的最初的目的。
第二,你可能會嘗試去建立一個針對你的資料庫的自製的加密解決方案,但是有以下三個理由說明你不要這樣做:
除非你是加密專家,否則胡亂編寫的加密系統只會提供非常低級的價值不高的保護。新鮮的是,單向密碼雜湊或者 "ROTx "形式的加密幾乎不需要費事就可以被輕鬆打敗。
如果由於你自己的能力的缺乏而導致加密被破解,那麼你的資料就完蛋了。你需要將所有的東西進行沒有加密的備份,是嗎?(即使你加密了,那裡有沒有安全性漏洞?)
當市面上提供有專業層級的,具有工業強度的加密解決方案的時候,你就不值得花費時間去自己做。把你的時間用於構建一個好的,堅固的資料庫,而不是再重新發明一次車輪。
那麼,什麼才是好的加密資料的方式呢?
對於新手,微軟提供了一個自己產生的加密解決方案,CryptoAPI 。對於輕量級的加密,軍用層級的安全就不在考慮範圍之內,它具有相對容易實現的優勢:管理員可以安裝一個名為CAPICOM 的ActiveX 控制,它可以在T-SQL預存程序中提供CryptoAPI 功能。CAPICOM 支援各種類型的雙向加密和單向雜湊演算法,所以管理員可以挑選最適合應用程式的問題的部分。
如果你對使用微軟的解決方案不感興趣,還有一些很好的第三方的方案可以使用。一家名為ActiveCrypt 的軟體有限責任公司製造了XP_CRYPT ,它是SQL Server的外掛程式,可以在視圖、程式和觸發器中通過擴充預存程序和使用者自訂函數(在SQL Server 2000中)來完成加密。你可以下載一個支援無線MD5,DES ,以及SHA1雜湊的免費版本的應用程式; 其他的加密模型就是在位元深度上進行的。(完全版本是無限的。)在你自己的代碼中,你可以使用XP_CRYPT,與ActiveX 控制一樣(在受限的免費版本中)。對於ASP程式員來說,一個名為AspEncrypt 的組件提供了一種將進階加密整合到你的代碼中的簡單方式。
對資料庫檔案自身進行加密或者提供傳輸層上的安全保護怎麼樣?對於前者,大家可以在Windows系統中持續使用加密檔案系統。然而,你必須儲存加密金鑰的備份,在出現問題的時候,這個資料有可能會丟失。對於後者,有IPSec和SQL Server自己的SSL加密,都是SQL Server和Windows內建的大家的主要精力應該放在避免以明文儲存敏感性資料,因為從資料庫中抽取沒有加密的資料同樣是最容易受到攻擊的薄弱環節。