Hash

用無鹽 bcrypt 或 scrypt 散列的 20 字節隨機字元串?

  • August 17, 2019

我有使用 SHA-1 雜湊作為 API 密鑰的使用者。這些是 SHA-1 的隨機饋送,因此您可以假設它們是完全隨機的。沒有使用者名與 API 密鑰一起發送。如果我的伺服器遭到入侵,我不想以明文形式儲存 API 密鑰,但我不能使用鹽,因為使用者名是這裡的密碼。SHA-1 雜湊是 20 個字節,即 2^160 種可能性。

在正常的密碼驗證方案中,您可能有一個使用者 Frank。Frank 使用他的使用者名和密碼登錄。使用使用者名可以在數據庫中查找 Franks salt 和 hash。

我無法儲存鹽,因為我不知道 SHA-1 雜湊對應的行。我只能散列它,看看它是否匹配。如果我在散列中隨機儲存一個鹽,我怎麼知道哪個鹽屬於哪個明文 API KEY?


沒有鹽的 scrypt 或 bcrypt 容易受到彩虹表攻擊,對吧?是否有足夠高的工作因數我不需要擔心?

好吧,首先讓我們澄清您的要求,我的理解是:您有一些系統僅將密鑰作為驗證數據。此密鑰用作密碼,但沒有使用者名,因此您只需檢查給定密鑰是否在授權列表中。

您的問題的答案相當簡單:假設您的密鑰是真正的 160 位隨機密鑰,並且您沒有數百萬使用者,那麼您的安全性仍然遠遠超過 128 位安全性。這比傳統的使用者名密碼設置要好得多。當然,如果密鑰被洩露,那麼它就不安全了。您還對其進行了雜湊處理(如果我理解的話,再一次),這使得它可以安全地防止從伺服器讀取數據。

簡單地說:除非你有數万億使用者,否則無事可做。不需要 scrypt/bcrypt,只需要一個雜湊。即使沒有使用者名和成千上萬的使用者,160 位密碼也是安全的。但是,所有這些都假設您使用 TLS。否則,當有人發送密鑰時,您的協議就像 MitM 一樣容易被破解。

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