程序如何验证加密文件密码?

时间:2014-05-26 08:49:18

标签: c++ encryption passwords winzip

  • 考虑(例如)我们使用win-zip 9加密文件(sample.txt),输入密码" agoodpassword"。
  • 现在,如果我们尝试通过输入错误的密码来打开文件,我们会收到一条错误消息:输入的密码不正确。

问题:

软件如何验证输入的密码是否正确?文件的内容可以是任何随机数据,因此在解密后检查文件中的错误是行不通的。但是软件还需要一些来源来验证这个密码;那么这个win-zip软件如何验证解密是否成功?

我怀疑密码也可能存在于加密的同一文件中。它是真的还是软件采用任何其他方法?

2 个答案:

答案 0 :(得分:2)

许多创建密文的应用程序也创建了一个身份验证标记,而不仅仅是加密。可以在解密之前检查此认证标签;如果认证标签不正确,则其中一个参数(密钥,IV或密文)不正确。

要使用密码进行加密,通常使用PKCS#5(基于密码的加密)。 PKCS#5包含密码散列方法,该方法利用"密钥扩展",使攻击者更难以使用强力或字典攻击来测试/比较许多密码。这种密码散列方法称为基于密码的密钥导出函数或PBKDF。最新的PKCS#5描述了PBKDF2。

现在,如果您想创建一个新的基于密码的加密方法,我建议您执行以下操作:

  1. 执行具有(非常)高迭代计数和128位盐的PBKDF2;
  2. 确保用户获得有关密码强度的反馈;
  3. 对PBKDF2的结果执行KBKDF(基于密钥的密钥派生函数),创建检查值,数据加密密钥和数据验证密钥;
  4. 使用数据加密密钥进行加密方法,例如AES-128-CBC随机IV;
  5. 使用HMAC的数据验证密钥而不是 IV 和密文;
  6. 存储支票值;
  7. 要在解密期间验证密码是否正确,请使用检查值。

    请注意,我还没有讨论过KBKDF。您可以在PBKDF2的输出上使用散列,并使用简单的计数器或字符串,例如SHA-256(key seed, "ENC")

答案 1 :(得分:1)

您可以使用哈希值来提供非常高的概率,即拒绝正确密码以外的任何内容。基本上,如果你对一个密码进行哈希,它就会生成一个具有一定数量二进制数字的数字,而一个好的加密哈希就会产生一个完全不同的数字(就像随机事物使不同而不同)键入甚至最微小的东西(例如,更改两个字符的顺序,或使用大写而不是更低)。

两个不同的密码产生相同散列值的可能性仍然很小......例如,如果你只有一个32位散列值,那么大概有1到2 ^ 32(40亿)的机会。创建一个不允许你检索密码的哈希函数在数学上非常复杂(特别是如果它是一个短密码,有人可以预先生成一个具有特定哈希值的短词列表),所以你可能想要有一个非常弱的哈希 - 只要足够好以避免为99.99%的拼写错误返回损坏的数据 - 和/或一个已知会抵抗此类攻击的数据。