AES:如何检测输入的密码是否错误?

2024-04-25

A text s已加密:

s2 = iv + Crypto.Cipher.AES.new(Crypto.Hash.SHA256.new(pwd).digest(), 
                                    Crypto.Cipher.AES.MODE_CFB, 
                                    iv).encrypt(s.encode())

然后,稍后,用户输入密码pwd2我们用以下方法解密它:

iv, cipher = s2[:Crypto.Cipher.AES.block_size], s2[Crypto.Cipher.AES.block_size:]

s3 = Crypto.Cipher.AES.new(Crypto.Hash.SHA256.new(pwd2).digest(),
                           Crypto.Cipher.AES.MODE_CFB, 
                           iv).decrypt(cipher)

问题:即使输入密码,最后一行也有效pw2是错的。当然,解密的文本将是随机字符,但不会触发错误。

问题:如何制作Crypto.Cipher.AES.new(...).decrypt(cipher)如果密码失败pw2是不正确的?或者至少如何检测错误的密码?


这是一个链接的问题:如果密码无效,则 AES 解密失败 https://stackoverflow.com/questions/14988689/making-aes-decryption-fail-if-invalid-password这里是关于问题的加密部分(较少编程)的讨论:AES,这种表示“您输入的密码错误”的方法安全吗? https://crypto.stackexchange.com/questions/76155/aes-is-this-method-to-say-the-password-you-entered-is-wrong-secure.


AES 提供机密性,但不提供开箱即用的完整性 - 要获得完整性,您有几种选择。最简单且可以说最不容易“搬起石头砸自己的脚”的方法就是使用 AES-GCM - 请参阅这个Python例子 https://github.com/luke-park/SecureCompatibleEncryptionExamples/blob/master/Python/SCEE.py or this one https://pycryptodome.readthedocs.io/en/latest/src/cipher/modern.html#gcm-mode.

您还可以使用 HMAC,但这通常需要管理两个不同的密钥,并且有更多的移动部件。如果您可以的话,我会推荐第一个选项。

附带说明一下,在将用户创建的密码转换为加密密钥时,SHA-256 并不是一个很好的 KDF。流行的密码哈希算法在这方面做得更好 - 看看 Argon2、bcrypt 或 PBKDF2。

Edit:SHA-256 是一个糟糕的 KDF 的原因与它产生一个糟糕的密码哈希函数的原因相同 - 只是too fast。例如,用户创建的 128 位密码所包含的熵通常比 128 位随机序列要少得多 - 人们喜欢选择单词、有意义的序列等。使用 SHA-256 对其进行一次哈希处理并不能真正缓解此问题。但是用像 Argon2 这样的结构对其进行散列设计得慢使得暴力攻击变得不太可行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES:如何检测输入的密码是否错误? 的相关文章

随机推荐