Hash

為什麼我需要為生成的雜湊儲存鹽?

  • May 20, 2020

我是加密和身份驗證的新手,所以一直在閱讀這方面的內容,並認為我對它的工作原理有很好的理解。然而,當我使用實現我的散列時,bcrypt.js我再次感到困惑。

我認為步驟是:

商店憑證:

  1. 生成隨機鹽
  2. 將鹽附加到密碼
  3. 從連接的字元串生成雜湊
  4. 儲存使用者名、雜湊和鹽

驗證使用者:

  1. 使用使用者名查找使用者記錄
  2. 將儲存的鹽附加到輸入的密碼
  3. 雜湊連接字元串
  4. 將生成的雜湊與儲存的雜湊進行比較

但是閱讀我可以生成的bcrypt.js 自述文件:

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("B4c0/\/", salt);

然後比較:

bcrypt.compareSync("enteredPassword", storedHash)

所以似乎根本不需要儲存鹽。

還要查看生成的雜湊:

[
   {
       "username": "UserOne",
       "hash": "$2a$10$M6qZCSbwhXipdmMy7kQ4V.obtALLSAjZsMYD/oGDAo0i/fcSGrmn2",
       "salt": "$2a$10$M6qZCSbwhXipdmMy7kQ4V."
   },
   {
       "username": "UserTwo",
       "hash": "$2a$10$Yb04C6pVgKVdNjHRB42vKOkr5Wf4QVG8gXyXVqZWnzCs6/MFnIC9G",
       "salt": "$2a$10$Yb04C6pVgKVdNjHRB42vKO"
   }
]

鹽似乎附加到雜湊中。在散列之前未附加到密碼。這對我來說似乎毫無意義,因為任何攻擊者都可以從雜湊中剝離鹽來獲得一個未加鹽的雜湊表。

正如我所說,我對這些東西真的很陌生,而且要搞清楚它有點困難。任何簡單的解釋都非常感謝。

返回的hashbcrypt.hashSync不僅僅是hash本身,它包含了bcrypt所需的所有參數。您不需要自己儲存任何其他資訊,這些資訊就是 bcrypt 需要散列和比較傳入密碼的所有資訊。

實際的雜湊是通過結合密碼和鹽來計算的,所以不用擔心。結構化數據只是為了讓您的生活更輕鬆,並且只需要一個對象來儲存。

在您的第一個範例中,輸出為:

$2a$10$M6qZCSbwhXipdmMy7kQ4V.obtALLSAjZsMYD/oGDAo0i/fcSGrmn2

這分解為:

  • 版本資訊:2a
  • 要執行的輪數:10
  • 鹽:M6qZCSbwhXipdmMy7kQ4V.
  • 實際雜湊:obtALLSAjZsMYD/oGDAo0i/fcSGrmn2

您可以在程式碼中查看詳細資訊

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