Hash
為什麼我需要為生成的雜湊儲存鹽?
我是加密和身份驗證的新手,所以一直在閱讀這方面的內容,並認為我對它的工作原理有很好的理解。然而,當我使用實現我的散列時,
bcrypt.js
我再次感到困惑。我認為步驟是:
商店憑證:
- 生成隨機鹽
- 將鹽附加到密碼
- 從連接的字元串生成雜湊
- 儲存使用者名、雜湊和鹽
驗證使用者:
- 使用使用者名查找使用者記錄
- 將儲存的鹽附加到輸入的密碼
- 雜湊連接字元串
- 將生成的雜湊與儲存的雜湊進行比較
但是閱讀我可以生成的
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" } ]
鹽似乎附加到雜湊中。在散列之前未附加到密碼。這對我來說似乎毫無意義,因為任何攻擊者都可以從雜湊中剝離鹽來獲得一個未加鹽的雜湊表。
正如我所說,我對這些東西真的很陌生,而且要搞清楚它有點困難。任何簡單的解釋都非常感謝。
返回的hash
bcrypt.hashSync
不僅僅是hash本身,它包含了bcrypt所需的所有參數。您不需要自己儲存任何其他資訊,這些資訊就是 bcrypt 需要散列和比較傳入密碼的所有資訊。實際的雜湊是通過結合密碼和鹽來計算的,所以不用擔心。結構化數據只是為了讓您的生活更輕鬆,並且只需要一個對象來儲存。
在您的第一個範例中,輸出為:
$2a$10$M6qZCSbwhXipdmMy7kQ4V.obtALLSAjZsMYD/oGDAo0i/fcSGrmn2
這分解為:
- 版本資訊:
2a
- 要執行的輪數:
10
- 鹽:
M6qZCSbwhXipdmMy7kQ4V.
- 實際雜湊:
obtALLSAjZsMYD/oGDAo0i/fcSGrmn2
您可以在程式碼中查看詳細資訊