bcrypt 和 pbkdf2 雙重雜湊
如果我想保護自己免受算法問題的實現和密碼雜湊算法的固有設計缺陷,那麼結合兩個雜湊值的最安全方法是什麼?
- bcrypt(pbkdf2(pw))
- pbkdf2(bcrypt(pw))
- f, l = 分裂(pw);pw = bcrypt(f) + pbkdf2(l) # 失去熵,不好
- pw = bcrypt(pw) + pbkdf2(pw) ##一個破,兩個破,特別差
還有什麼?我應該在添加熵的地方做 1-2 的變化嗎?
為什麼在數據庫中儲存使用者數據時這種常見/最佳實踐不是?當您結合實施+設計風險時,使用任何單一的雜湊算法似乎都有風險。使用 SHA 似乎是個奇怪的選擇,因為它的設計速度很快。
最終使用者需要考慮這一點並找出儲存 PW 的安全方法似乎很奇怪。
我不想通過這種方式使完美世界 bcrypt 或完美世界 pbkdf2 變得更好,我只是想假設在某些情況下,至少在特定環境中其中一個可能不好。或者在未來發現其中一個並不像想像的那麼安全,這給了我遷移到另一個雜湊組合的安全餘量,而不會進入恐慌模式。
你有兩種算法, $ A $ 和 $ B $ ,聲稱可以計算兩個(本質上)單射的、難以求逆且計算成本高的函式 $ F $ 和 $ G $ . 您擔心的是任何一種算法都會計算函式 $ F’ $ 和 $ G’ $ ,這可能既不是單射的,也不是難以反轉的,也不是計算成本高的。這可能是由於程式錯誤或(這些天)故意破壞而發生的。
你想要的是某種結合方式 $ A $ 和 $ B $ 使得相應的組合 $ F $ 和 $ G $ , $ F’ $ 和 $ G $ , 和 $ F $ 和 $ G’ $ (本質上)是單射的,難以反轉且計算成本高。(如果兩者都有缺陷,那麼顯然將無法做任何事情。)
請注意 $ F(G(\cdot)) $ 和 $ G(F(\cdot)) $ 是不好的結構(它們不能內射)。
那個工程 $ (F(\cdot),G(\cdot)) $ 不會失敗單射和計算成本高,但可能會失敗難以反轉。
如果我們假設 $ F $ 和 $ G $ , $ F’ $ 和 $ G $ , 和 $ F $ 和 $ G’ $ 在某種意義上是獨立的(也就是說, $ F’ $ 不是 $ G $ ), 然後
$$ F(\cdot) \oplus G(\cdot) $$應該可以。 我們為什麼不這樣做?在一定程度上,您可以通過與測試向量和其他已知良好的實現進行比較來驗證實現。