Mysql
加密已經散列的 BCrypt 密碼是否過大?
我正在使用 BCrypt 在伺服器端對我的密碼進行雜湊處理。在我將它儲存在我的 MySQL 數據庫中之前,加密我的散列 BCrypt 密碼是否過大,或者將散列直接儲存在數據庫中就足夠了?
該網站建議在散列密碼後對密碼進行加密:
只要攻擊者可以使用雜湊來檢查密碼猜測的正確與否,他們就可以對雜湊進行字典或暴力攻擊。下一步是將密鑰添加到雜湊中,以便只有知道密鑰的人才能使用雜湊來驗證密碼。這可以通過兩種方式完成。可以使用 AES 之類的密碼對散列進行加密,也可以使用 HMAC 等帶密鑰的散列算法將密鑰包含在散列中。
我正在用Java編碼。我試圖衡量增加的保護層與讀取和檢索使用者登錄密碼的速度性能是否值得。
添加這樣一個額外的秘密 - 理想情況下,將其安全地儲存在HSM中- 確實是一種正常的做法。確切地說,這並不常見;許多平台僅使用雜湊(通常比 bcrypt 更差的雜湊)。但是,如果操作正確,附加層肯定會使攻擊者的事情變得更加困難。
一些進一步的建議:盡可能少地自己滾動實現。相反,找到完善的庫來盡可能多地進行加密(因為很難做到正確——而且出錯確實會非常糟糕)。
請注意,bcrypt 有一些限制——特別是允許的最大明文長度為 72 字節。它也不是記憶體硬的,因此會受到(相對)低成本的具有許多並行核心的專用硬體的攻擊。現代選項 - scrypt 和 Argon2 系列 - 可以抵抗低記憶體並行化。尋找那些成熟的實現。此外,使用 bcrypt 的工作因素成本與您的使用者(和預計的硬體)可以承受的一樣高(成本 12 通常是它開始接近收支平衡點的地方,但是 YMMV;在您的硬體上進行測試)。