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