Hash
基於 sha-256 的流異或密碼的安全性?
前提是我有一些要加密的數據和密碼:
- 我生成一個隨機 IV
- 我定義
c = sha256(password)
- 我生成了一個無限流,其中
x0 = sha256(IV xor c) and xi = sha256(xi-1 xor c)
. 這會產生 32 字節的塊,我會逐字節地產生它們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 來派生密鑰。
總體而言,當您編寫這樣的內容時,您應該更多地關注您在此處實際嘗試保護的內容。不要亂發明自己的流密碼——這是一個已解決的問題。要做到這一點,您需要明確說明您在應用程序中嘗試使用哪些資源進行操作,對手如何操縱這些資源,以及您希望確保對手無法做到的事情。 然後你可以決定如何使用加密來防止對手的惡作劇——你幾乎肯定需要在加密之外進行一些身份驗證。