Bcrypt
Bcrypt 輸入長度與衝突
我目前正在實施 oauth2 不記名令牌身份驗證,並且正在儲存 bcrypt 加密的令牌。我的問題是令牌應該多長時間才能達到最大的安全性。例如,更長的令牌在多長時無用,因為 bcrypt 衝突與猜測令牌一樣可能。
bcrypt 算法通過使用密碼派生的河豚密鑰加密三個 64 位塊來生成 192 位密碼雜湊。然而,用於儲存 bcrypt 散列的通用格式僅包含 184 個輸出位。
如果 bcrypt 是一個“完美”的 184 位散列,那麼找到某個原像所需的工作量與對 184 位密鑰的暴力攻擊相同。因此,如果您有隨機二進制令牌,那麼長度超過 184 位的令牌將毫無用處。同樣,對於隨機的十六進制標記,超過 46 個字元的長度將是無用的,等等。
許多 bcrypt 實現對輸入長度也有限制。這通常至少為 51 個字節,因此如果您的輸入格式是十六進制、基數 64 或二進制,則將首先達到上述限制。如果您正在散列一些不太密集的編碼,例如十進制數字(或實際上是密碼……),它可能不是。
但是,如果您的令牌具有高熵(例如 128+ 位),則無需使用 bcrypt。Bcrypt 對於減緩蠻力或字典攻擊很有用,但 128 位就足夠了,這樣的攻擊是不可行的。諸如 HKDF 之類的密鑰派生函式,甚至是簡單的加鹽散列,就足夠了。