用戶密碼安全存儲建議
安全小測驗
:存儲機密信息最安全的辦法是什么?</span>
a)利用 256 位密鑰的強對稱加密算法(例如 AES)進行加密。 b)利用 4096 位密鑰的非對稱強加密算法(例如 RSA)進行加密。 c)利用平臺內置的加密系統進行加密,例如 Windows 的數據保護 API (DPAPI)。 做出選擇了嗎?正確的答案實際上是: d)既然是機密數據,就完全不要存儲! 好吧,這個問題看上去有點難,但其答案是很有道理的:竊賊無法竊取根本不存在的東西。我們把這個原則應用到身份驗證操作,如網站登錄。如果一個網站永遠不 存儲用戶的密碼,那么即使網站受到攻擊,這些密碼也不能被盜走。但是網站如何在不存儲用戶密碼的情況下來驗證用戶的身份呢?答案就是網站存儲密碼的加密哈 希,而不是明文密碼本身。(如果你對哈希的概念不熟悉,我們建議你在繼續前閱讀http://msdn.microsoft.com/zh-cn/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/zh-cn/magazine/ee321570.aspx] 中閱讀了解關于建議解決辦法的更多信息。就像 SDL 強制在微軟產品中使用強加密算法一樣,它也鼓勵產品團隊盡可能使用加密靈活性,這樣可以在當前強算法遭到破解的情況下更敏捷地遷移到新算法。 到目前為止,我們已經討論了要對哪些內容進行哈希計算(密碼和隨機的特定鹽值)以及如何進行哈希計算(使用 SHA-2 系列中的加密強哈希算法,最好是可配置的,以便允許進行未來變更),但是我們還沒有討論哈希計算的應用位置。 你可能會認為在客戶端執行哈希計算將能極大地提高安全性,因為你只需要通過網絡向服務器發送哈希,而絕不會發送明文密碼本身。不過,好處也并不像你想象的 那么多。如果攻擊者能夠嗅探網絡流量,他仍然可以攔截傳輸,并自行將哈希傳遞到服務器,從而欺騙用戶,劫持其會話。這時,哈希本質上會成為明文密碼。這個 方法唯一切實的好處就是如果受害者在多個網站上使用同一密碼,則攻擊者將不能在其它網站損害受害者的帳戶,因為知道密碼的哈希值并不會告訴你關于密碼本身 的任何內容。防御此類攻擊的更好方式是,在服務器端執行哈希計算,但確保密碼和所有憑據令牌(例如會話 Cookie)始終通過 SSL/TLS 進行傳輸。在將來發布的博文中,我們會討論安全憑據傳輸(和密碼管理的其他方面,例如密碼復雜性及其過期時間)。 遵循下面一些簡單的原則,有助于你確保應用程序的用戶憑據仍保持安全,即便在數據庫被攻破的情況下也是如此: ·始終存儲并比較密碼的哈希,而永遠不要存儲明文密碼本身。 ·在進行哈希計算前,對每個密碼應用隨機且特定的鹽值。 ·使用加密的強哈希算法,例如 SHA-2 系列之一。 ·通過實施靈活的加密設計,允許未來潛在的算法變更。 ·對服務器層進行哈希計算,并確保通過 HTTPS 傳輸所有密碼和憑據令牌。 資深安全項目經理 微軟SDL(安全開發生命周期)團隊