Encryption

將密碼的雜湊值與密文一起標記是否安全?

  • February 16, 2021

假設我有一個密碼,我使用 Argon2ID 和 1GB 記憶體來派生一個加密密鑰。然後,我使用 XChaCha20 使用該加密密鑰加密我的數據。ChaCha 的問題在於任何加密密鑰都“有效”。如果您使用錯誤的密碼進行解密,您將不會得到像 AES 那樣的空輸出或錯誤,相反,您只會得到損壞/無用的數據。我希望能夠驗證密碼,以便在解密之前知道它是否正確。如果我使用 Argon2ID 密碼的 SHA3_512 並將其包含在密文中,那麼密文現在是否容易受到攻擊?我正在使用 CSPRNG 生成 Argon2ID 的鹽和 ChaCha 的隨機數,這會推遲彩虹表。這個方案安全嗎?這是一個視覺範例:

plaintext = "sfsdfasdfadfasdfasdfasdfadf"
password = "some_very_strong_password_blah"
salt = csprng(16)
nonce = csprng(24)
key = argon2id(password,salt,t=32,m=1GB,p=4)
ciphertext = XChaCha20.encrypt(plaintext,password,nonce=nonce)
check = sha3_512(key)
ciphertext += check
// Done. To check the password,
// I would derive the key using Argon2ID
// again and compare it with 'check'

這會安全嗎?我知道這個問題,但這種情況沒有 KDF 並且不包含任何熵。謝謝。

更新:如果使用了錯誤的密鑰,AES 不會給出空輸出。我使用的加密庫可以。

您也不會在 AES 中得到空輸出。AES 是一種排列,將始終返回明文,正確與否取決於密鑰。

如果我使用 Argon2ID 密碼的 SHA3_512 並將其包含在密文中,那麼密文現在是否容易受到攻擊?

需要找到密鑰的原像,通常這樣做的成本約為 $ 2^{512} $ 但是,對於 SHA3-512,如果您使用的是 xChaCha20,那麼成本大約是 $ 2^{256} $ 因為輸入是 256 位密鑰。無論如何,被暴力破解是安全的。

您還可以加密全零消息塊或您選擇用於驗證密鑰的任何隨機消息塊。

請注意,如果解密數據的前 4 個字節包含 ASCII 字元串“VERA”,則認為 Veracrypt 使用解密成功

這個方案安全嗎?

首先,您的密碼強度很重要。您應該使用 dicewire 擁有強密碼或使用密碼管理器來生成一個,而這些仍然需要您提供主強密碼。

缺少的部分是數據的完整性,您可以將Poly1305與xChaCha20一起使用,也可以具有機密性、完整性和身份驗證。

另一個問題可能是加密數據的更新。如果你使用相同的 $ (Key, nonce) $ 對於更新配對,文件的更新部分容易受到拖拽,該部分可能無法保密。為了緩解這種情況,您需要使用新的 $ nonce $ 並加密所有消息或使用新密鑰。

旁注;您可以使用此強密碼直接使用 Argon2id 派生多個密鑰,或使用 HKDF的擴展部分,因為從 Argon2id 派生的密鑰已經是偽隨機密鑰。

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