使用 bcrypt 始終產生相同的雜湊值,如 SHA、MD
我想利用 bcrypt 的慢速屬性對輸入進行雜湊處理,但也希望每次都為相同的輸入獲得相同的雜湊值,就像 SHA、MD 等一樣。
因此,為了做到這一點,而不是使用我認為不太安全的靜態鹽,我正在考慮將輸入也用作鹽?輸出將是雜湊值減去前面的鹽位(顯然是輸入本身)。
基本上
Given an input m, bcrypt(cost, m, m) -> ctext
,最後沒有串聯。所以問題是使用輸入作為鹽和密碼是否會降低基於 bcrypt 屬性的密鑰派生步驟的安全性?
正如評論中提到的,bcrypt 是一種密碼散列,與一般的加密散列函式相比有很大的局限性。
按預期使用它來輸入密碼,但鹽與輸入相同,與完全不使用鹽一樣安全。salt的目的是防止多目標攻擊,防止使用彩虹表。如果鹽與輸入相同,則允許這些攻擊,因為攻擊者現在知道給定目標密碼的鹽是什麼。
將其用作一般雜湊函式會遇到一組完全不同的問題,最糟糕的是衝突。bcrypt 對輸入文本有 72 字節的輸入限制,如果您散列大量數據,它將具有與其 72 字節前綴相同的散列。bcrypt 還會重複短輸入,直到填滿 72 字節狀態數組,因此 18 個字元的密碼將具有與該密碼重複 4 次相同的輸出。實現可以在輸入 bcrypt 之前使用 SHA-512 之類的東西對輸入進行預散列,從而防止這些問題。儘管在這種情況下,儘管速度很慢,但它的輸出長度仍然只有 192 位,這極大地限制了它在數字簽名等用途中的抗碰撞性。
有了所有這些限制,如果你想減慢散列函式的速度,顯然有更好的選擇,最明顯的就是重複執行散列函式的輸出。這也沒有 bcrypt 複雜,並且可以讓您在軟體和硬體中重用已經存在的功能。如果您擔心由於某種原因卡在雜湊鏈中,您總是可以在輸入中添加一個簡單的迭代計數器字。對於某些參數化雜湊函式,您還可以增加內部輪數。例如,Keccak 可以輕鬆擴展以使用更多輪次,一些通過算法生成輪次密鑰的實現可能只需要更改一行程式碼。