Hash

完全公開的密碼雜湊值能否可靠安全?

  • September 29, 2013

這是一個假設性的問題,我對密碼學只有一個基本的了解。

如果要遵循儲存密碼片語的最佳加密實踐,是否有可能公開所有資訊(使用者名、雜湊、鹽、使用的算法),並且仍然可以合理地確定沒有人可以破解它們?

我假設必須有一個最小長度約束——比如 12 個,或者至少 16 個字元——顯然如果有人選擇“1111111111111111”,那麼它很容易猜到,但假設人們選擇了合理的密碼,比如“正確的馬電池訂書釘”,這行得通嗎?

對於任何值 $ x $ 在一組尺寸中隨機選擇 $ N $ , 和散列函式 $ h $ , 出版 $ h(x) $ 允許對 $ x $ 平均成本 $ N/2 $ . 這是不可避免的。

密碼的問題在於,由於適合人類的大腦,它們往往會出現一組相對較小的潛在密碼 $ N $ . 我們試圖通過使 $ h $ 一個緩慢的功能,並使用新的變體 $ h $ 每次(這就是的含義)。有關密碼雜湊的詳細資訊,請參閱此答案

現在這只是一個平均值。雖然大多數人在記住許多粗大的隨機密碼時都會遇到困難,但普通人可以記住一個真正隨機的密碼,其熵足以擊敗窮舉搜尋。這將意味著一些努力,所以很多使用者不會這樣做。

是關鍵詞。熵 $ n $ bits 表示一組大小的密碼 $ N = 2^n $ (這是一種簡化:我假設所有潛在的密碼都具有相同的被選中機率)。在描述“正確馬”方法的著名漫畫的情況下,聲稱熵為 44 位。這在數學上是正確的(請參閱該答案進行分析)。但是,44 位並不多,肯定不足以擊敗窮舉搜尋。密碼學家長期以來一直需要至少 80 位,作為“通過暴力破解牢不可破”的經驗法則;技術的不斷進步,以及對二次冪的審美吸引力,現在使“128 位”成為黃金法則。可以說,128 位的熵應該可以在相當長的一段時間內抵抗蠻力。

基本上,“正確馬”密碼生成方法假設一個包含 2048 個單詞的列表,並且在該列表中隨機且均勻地選擇四個單詞。即列表中的一個詞有四個連續的選擇,並且選擇是相互獨立的(所以同一個詞可以被選擇多次)。用12 個單詞而不是 4 個單詞,你的密碼將堅如磐石,即使你公佈了它的雜湊值。

(如果你使用帶鹽的慢散列和足夠的迭代,這十二個單詞可以減少到,比如說,九個或十個單詞。)

如果服務的使用者可以選擇他們的密碼,這個問題的簡短回答是“不”。

細節

如果使用 PIN 或密碼?

沒有辦法強迫人們選擇安全的密碼。當密碼很長時,至少有一些(懶惰的)使用者會製作很長的密碼,但熵很少。

當密碼或 PIN 變長時,人們往往會變得更懶惰。有一篇關於PIN碼選擇的文章:http ://www.datagenetics.com/blog/september32012/ 。據調查,11% 的 4 位 PIN 使用者使用最常用的 PIN 碼 1234。23% 的 5 位 PIN 使用者使用 12345。總體而言,猜測 5 位 PIN 比 4 位更有可能猜到別針。現在回到您問題的答案:這種現像也適用於密碼;如果密碼變長,密碼不一定會變好。永遠不要低估使用者發明“易記”密碼的技巧。

對於密碼,2007 年有一項關於密碼質量的大型研究:http ://research.microsoft.com/pubs/74164/www2007.pdf 。大約 20% 的使用者的密碼強度約為 20 位。因此,如果攻擊者隨機選擇密碼進行攻擊,他們可以預期他們只需幾次嘗試就可以面對如此低熵的密碼。

如果使用密碼?

在著名的蘭德爾漫畫中,密碼是從字典中隨機選擇的。因此人們無法選擇記住他們想要的密碼,但他們需要使用一些安全的隨機數生成器(如 5 個骰子)和密碼列表來獲取他們的密碼。如果使用者不這樣做,則“i”、“love”、“password”、“horse”、“staple”等詞會被過度表示,並且預期的熵實際上會有所降低。另請注意:如果我確實記住了正確的馬釘和電池,我仍然無法記住釘馬電池的正確順序並正確。如果它是穩定的或主要的。因此,即使是長密碼也有問題。

但是讓我們假設使用者有這樣的密碼,每個字 11 位安全性,四個字。如果我們還假設攻擊者能夠檢索密碼或密碼雜湊,那麼攻擊者可以嘗試以他們可以承受的任何並行化程度來暴力破解密碼/密碼。如果密碼散列算法是完美的,攻擊者嘗試單個密碼的成本將與通常用於驗證的密碼相同。在弱密碼雜湊中(例如沒有鹽的單個 SHA),由於彩虹表,每次嘗試的成本要低得多。但是,現在我們假設密碼雜湊是完美的,並且攻擊者不會從他將要執行的操作量中獲得顯著收益,那麼他平均必須進行 2^(entropy_in_bits-1) 次試驗才能達到密碼/片語。

我們還假設只有一台伺服器進行身份驗證,並且需要 1 秒來驗證使用者身份。1秒的認證時間相當長(因為在高峰期可能有很多使用者願意同時認證)。

攻擊者的能力取決於你的對手,但為了爭論,我們假設它是Google。Google代表了具有相當大計算能力的對手。我們還假設他們的伺服器花費相同的時間來檢查密碼猜測。根據 Randall 的說法,Google 擁有 1.8 到 220 萬台伺服器。如果所有這些伺服器都嘗試以 44 位熵的強度破解密碼,則密碼平均會在 1.6 個月左右破解。(我用 2^43 / 2629800 / 2100000 來估計。)

這就涉及到:對於非常強大的對手,如果他們得到密碼雜湊值,熵 2^44 是不夠的,無論使用 bcrypt、PBKDF2 還是 scrypt。另請注意,熵 2^44 比您在實踐中使用的密碼要大。我不知道對網站中實際使用的密碼片語的大規模公開研究,主要是因為網站似乎更喜歡密碼。


多少才夠?

如果最差的密碼使用 64 位熵(上面討論的 44 位多 20 位),那麼理論上非常慢的散列可以讓您期望 80 位的安全性,根據一些專家的說法,目前對於大多數用途來說這仍然足夠。例如,NIST(參見 SP 800-131A)在幾個月內仍然允許 80 位安全性。為了長期安全,需要 112 位或 128 位安全性。這將轉化為 10-12 個單詞,就像 Thomas Pornin 在他的回答中指出的那樣。10-12 個單詞太長了,不實用(我一開始就“懶惰”的觀點)。


請注意我在開頭的評論:如果使用者有機會發明自己的密碼

現在假設該服務確實為所有使用者生成了密碼,使用正確播種、正確實施的隨機數生成(即,密碼的生成就像它們是密鑰一樣)。如果服務對所有使用者都有相對較長的密碼,那麼可以看出公共密碼雜湊可能是可靠的安全的(但是……為什麼無論如何都要發布雜湊和鹽?)。

注意:關於如何實現此選項有很多細節。PBKDF 或 scrypt 可用於稍微減少密碼長度等。但密碼會很長,難以記住,並且可能會被某些使用者寫在例如黃紙筆記上。

引用自:https://crypto.stackexchange.com/questions/10533