天天看點

遠離密碼洩露:安全存儲密碼的加密哈希

  安全小測驗:存儲機密資訊最安全的辦法是什麼?

  a) 利用 256 位密鑰的強對稱加密算法(例如 AES)進行加密。

  b) 利用 4096 位密鑰的非對稱強加密算法(例如 RSA)進行加密。

  c) 利用平台内置的加密系統進行加密,例如 Windows 的資料保護 API (DPAPI)。

  做出選擇了嗎?正确的答案實際上是:

  d) 既然是機密資料,就完全不要存儲!

  好吧,這個問題看上去有點難,但其答案是很有道理的:竊賊無法竊取根本不存在的東西。我們把這個原則應用到身份驗證操作,如網站登入。如果一個網站永遠不存儲使用者的密碼,那麼即使網站受到攻擊,這些密碼也不能被盜走。但是網站如何在不存儲使用者密碼的情況下來驗證使用者的身份呢?答案就是網站存儲密碼的加密哈希,而不是明文密碼本身。(如果你對哈希的概念不熟悉,我們建議你在繼續前閱讀 http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx#hash_values。)通過比較哈希而不是明文,網站仍然可以驗證使用者确實知道自己的密碼,不然哈希将不會比對,而實作這個過程并不需要網站實際存儲密碼(如圖1所示)。這是一個不錯的解決方案,但是仍有一些設計方面的注意事項你,以確定你不會無意間削弱系統的強度。

  第一個設計問題是,簡單地對密碼進行哈希計算并不能提供充分的保護:你還需要在計算哈希值前為每個密碼添加随機鹽值(Salt)。切記,對于給定的哈希函數,對某個輸入值計算哈希值始終會得到相同的輸出值。如果時間充裕,攻擊者可能會計算出明文字元串及其相應哈希值的表。事實上,已經存在很多這樣的表(稱為“彩虹表”),并且可在 網際網路 上免費下載下傳。有了彩虹表後,如果攻擊者通過任意方式設法擷取了某網站的密碼哈希清單,那麼他可以使用該表輕松地确定初始的明文密碼。當你對哈希加鹽值時,你就可以從攻擊者手中奪走這個武器。另外,要為每個使用者生成(并存儲)特定的鹽值,而不是每個使用者使用相同的鹽值,這一點很重要。如果你始終使用相同的鹽值,則攻擊者可能會建構一個使用該單一鹽值的彩虹表,進而提取出密碼。

  圖 1:比較加鹽值後的哈希值

  另一個重要的設計問題是,一定要使用強加密雜湊演算法。MD5可能是比較常見的選擇,但是密碼學家已經論證了MD5的脆弱性,近年來它一直被認為是不安全且“可破解”的算法。SHA-1 安全性稍微強一些,但它也開始顯現被破解的迹象,現在密碼學家建議避免使用 SHA-1。SHA-2 雜湊演算法系列目前被視為最強健的算法,是唯一獲得 微軟安全開發生命周期 (SDL) 加密标準政策準許,可以在 微軟 産品中使用的雜湊演算法系列。

  相比将SHA-2寫死入程式,一個更好的辦法是實施 “加密靈活性”,就是說即使應用程式已經部署到生産中,也仍然可以改變雜湊演算法。畢竟,加密算法會過時;密碼學家會發現其弱點,并且随着計算能力的增強,使用暴力攻擊破解越來越輕松可行。某一天,SHA-2 可能會被認為和 MD5 一樣脆弱,未雨綢缪不失為明智的選擇。對哈希靈活性進行深入分析讨論已經超出了本篇博文的讨論範圍,不過,你可以在 MSDN 雜志文章“加密靈活性”[http://msdn.microsoft.com/en-us/magazine/ee321570.aspx] 中閱讀了解關于建議解決辦法的更多資訊。就像 SDL 強制在微軟 産品中使用強加密算法一樣,它也鼓勵産品團隊盡可能使用加密靈活性,這樣可以在目前強算法遭到破解的情況下更靈活地遷移到新算法。

繼續閱讀