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

问题:

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

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

4

2 回答 2

2

许多创建密文的应用程序不仅会加密,还会创建身份验证标签。解密前可以检查这个认证标签;如果身份验证标签不正确,则参数(密钥、IV 或密文)之一不正确。

要使用密码进行加密,通常使用 PKCS#5(基于密码的加密)。PKCS#5 包含一种密码散列方法,该方法利用“密钥拉伸”,使攻击者更难使用暴力或字典攻击测试/比较许多密码。这种密码散列方法称为基于密码的密钥派生函数或 PBKDF。最新的 PKCS#5 描述了 PBKDF2。

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

  1. 执行具有(非常)高迭代次数和 128 位 salt 的 PBKDF2;
  2. 确保用户得到有关密码强度的反馈;
  3. 对PBKDF2的结果执行KBKDF(key based key derivation function),创建校验值、数据加密密钥和数据认证密钥;
  4. 将数据加密密钥用于加密方法,例如带有随机 IV 的 AES-128-CBC;
  5. 在 IV和密文上使用 HMAC 的数据认证密钥;
  6. 存储校验值;

要在解密期间验证正确的密码,请使用校验值。

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

于 2014-05-26T09:43:46.190 回答
1

您可以使用哈希值来提供非常高的概率,即除了正确密码之外的任何内容都将被拒绝。基本上,如果你对密码进行哈希处理,它会产生一个带有一定数量二进制数字的数字,而一个好的加密哈希会产生一个完全不同的数字(在随机事物往往不同的情况下),如果你输入的东西即使是最微小的不同(例如,更改两个字符的顺序,或使用大写而不是小写)。

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

于 2014-05-26T09:10:41.750 回答