Hash

基於 sha-256 的流異或密碼的安全性?

  • December 16, 2017

前提是我有一些要加密的數據和密碼:

  1. 我生成一個隨機 IV
  2. 我定義c = sha256(password)
  3. 我生成了一個無限流,其中x0 = sha256(IV xor c) and xi = sha256(xi-1 xor c). 這會產生 32 字節的塊,我會逐字節地產生它們
  4. output = data xor stream

這會安全嗎?如果不是,它有多不安全?

*注意:*美國國家安全域不會破解它,我只需要它對具有平均高密碼知識的使用者來說是安全的。

我知道它可能看起來類似於Is it possible to build a stream cipher from a cryptographic hash function? 但它有一些區別:

  • 我使用隨機 IV 而不是從 hash(data) 開始
  • 我在流生成器的每個階段對 c 進行異或運算,所以即使知道 xi 你也猜不到 xi+1

給定一個統一的隨機密鑰和每個消息的唯一隨機數,流密碼部分在密碼學上很好,因為 SHA-256 沒有顯示原像抗性失敗的證據,但它非常慢,因為 SHA-256 是為更昂貴的抗碰撞性而設計的。沒有理由比 XSalsa20 更喜歡它。

如果您像大多數人那樣使用由熵遠低於 128 位的程序選擇的密碼,那麼基於密碼的密鑰派生函式就會出現問題,因為對手測試密碼猜測的成本可以忽略不計。您應該使用現代的基於密碼的密鑰派生函式,如 scrypt 或 argon2 來派生密鑰。

總體而言,當您編寫這樣的內容時,您應該更多地關注您在此處實際嘗試保護的內容。不要亂發明自己的流密碼——這是一個已解決的問題。要做到這一點,您需要明確說明您在應用程序中嘗試使用哪些資源進行操作,對手如何操縱這些資源,以及您希望確保對手無法做到的事情。 然後你可以決定如何使用加密來防止對手的惡作劇——你幾乎肯定需要在加密之外進行一些身份驗證。

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