- 考虑(例如)我们通过输入密码“agoodpassword”使用win-zip 9加密了一个文件(sample.txt)。
- 现在,如果我们尝试通过输入错误的密码来打开文件,我们会收到一条错误消息:输入的密码不正确。
问题:
软件如何验证输入的密码是否正确?文件的内容可以是任何随机数据,因此在解密后检查文件中的错误是行不通的。但是该软件仍然需要一些来源来验证此密码;那么这个win-zip软件如何验证解密是否成功呢?
我怀疑密码也可能存在于被加密的同一个文件中。是真的还是软件采用了其他方法?
问题:
软件如何验证输入的密码是否正确?文件的内容可以是任何随机数据,因此在解密后检查文件中的错误是行不通的。但是该软件仍然需要一些来源来验证此密码;那么这个win-zip软件如何验证解密是否成功呢?
我怀疑密码也可能存在于被加密的同一个文件中。是真的还是软件采用了其他方法?
许多创建密文的应用程序不仅会加密,还会创建身份验证标签。解密前可以检查这个认证标签;如果身份验证标签不正确,则参数(密钥、IV 或密文)之一不正确。
要使用密码进行加密,通常使用 PKCS#5(基于密码的加密)。PKCS#5 包含一种密码散列方法,该方法利用“密钥拉伸”,使攻击者更难使用暴力或字典攻击测试/比较许多密码。这种密码散列方法称为基于密码的密钥派生函数或 PBKDF。最新的 PKCS#5 描述了 PBKDF2。
现在,如果您想创建一个新的基于密码的加密方法,我建议您执行以下操作:
要在解密期间验证正确的密码,请使用校验值。
请注意,我还没有讨论 KBKDF。您可以在 PBKDF2 的输出上使用散列,并为此使用简单的计数器或字符串,例如SHA-256(key seed, "ENC")
.
您可以使用哈希值来提供非常高的概率,即除了正确密码之外的任何内容都将被拒绝。基本上,如果你对密码进行哈希处理,它会产生一个带有一定数量二进制数字的数字,而一个好的加密哈希会产生一个完全不同的数字(在随机事物往往不同的情况下),如果你输入的东西即使是最微小的不同(例如,更改两个字符的顺序,或使用大写而不是小写)。
两个不同的密码产生相同哈希值的可能性仍然很小......例如,如果您只有一个 32 位哈希值,那么大约有 2^32(40 亿)分之一的机会。创建一个不允许您检索密码的哈希函数在数学上变得非常复杂(特别是如果它是一个短密码,并且有人也可以预先生成具有特定哈希值的短单词列表),所以您可能想要拥有一个相当弱的哈希值——刚好足以避免为 99.99% 的错别字返回损坏的数据——和/或已知能够抵抗此类攻击的数据。