Hash
使用基於密碼的加密作為散列方案
經典方案:
- 給定
password
和hashing
算法- 產生
salt
- 計算
hash=hashing(password, salt)
- 分開存放
hash
&salt
檢查密碼有效性:比較儲存
hash
和計算test_hash=hashing(test_password, salt)
。如果hash=test_hash
- 密碼是正確的,否則測試失敗。提議的方案:
- 給定
password
,cipher
算法和預定義dictionary
(例如一組數字{0,1,2,3,4,5,6,7,8,9}
)- 產生
salt
test_phrase
從我們的隨機生成dictionary
(例如,只有隨機數字,如test_phrase=32759823767865236451236647894678923897
)- 計算
hash=cipher(test_phrase)
與key=keygen(password,salt)
- 儲存
hash
和salt
(無需儲存test_phrase
)檢查密碼有效性:
- 計算
test_phrase=decipher(hash)
一個test_key=keygen(test_password,salt)
- 檢查是否
test_phrase
僅包含預定義的符號/字節dictionary
(例如,解密的片語只是數字,例如解密的片語是否像:askjdfhasjkdfhasjkdhe-0123=jkasfhasjdfh
- 這意味著測試失敗,因為某些符號不是數字)問題
您如何看待這個提議的散列方案的優缺點?
hashing
本質上,您建議使用散列(因為您可以選擇=keygen
)作為加密某種測試值的密鑰,而不是檢查密碼的(加鹽)散列。主要問題是這是否會增加或降低安全性。
- 如果您直接儲存散列/密鑰,隨機選擇的密碼散列到相同值的機會是 $ 2^{-n} $ , 在哪裡 $ n $ 是散列的長度(以位為單位)。
- 如果您在範例中使用密鑰加密字典中的字元串(256 個中的 10 個),則隨機密鑰(來自密碼猜測)將儲存的值解密為有效值的機會 $ k $ -位字元串是 $ (10/256)^{k/8} = 25.6^{-k/8} \approx 1.5^{-k} $ .
要獲得同等的安全性,您需要儲存更長的驗證字元串。例如,要匹配 256 位雜湊值的安全性,您需要加密 439 位值。
此外,整個過程將使攻擊者放棄錯誤猜測的速度比驗證過程要快一些,因為大多數加密算法都以塊為單位進行加密,如果第一個塊不匹配,則整個過程都必須如此。
這還沒有考慮到使用依賴多個原語來確保其安全性的複雜方案所固有的不安全性。
您可以通過加密已知字元串(如零字元串)來恢復相同的長度與安全比率。複雜性的缺點仍然存在,沒有明顯的優點可以彌補。它可能更能抵抗弱散列,但這可能很難證明。