4

我搜索了整个网络,包括这里的 SO:有很多关于在散列和存储密码之前需要对密码进行加盐的讨论。

如果密码用于计算用于加密的密钥(“基于密码的加密”):如果您根本不存储密码怎么办?

认为:

用于加密

  1. 用户输入主密码
  2. 这是 SHA256 哈希,输出用于 AES256 加密文件
  3. 没有存储哈希(显然主密码也没有)

用于解密

  1. 用户输入主密码
  2. 这是 SHA256 哈希,输出用于解密文件
  3. 如果解密成功,则密码 - 显然 - 正确

我的问题:

除了加密文件本身之外不存储任何内容时,在散列之前对主密码进行加盐有什么好处?

注意事项:

  • 它可能会降低哈希冲突的可能性
  • 这将需要储存盐。
  • 如果盐丢失/损坏,用户将无法再解密文件

  • 如何在步骤 3 中检查是否成功解密:这是否需要知道部分文件内容?

  • 如果是这样,有多少错误将已知值存储在加密文件中(这不能总是被阻止 - 攻击者可能会猜测,例如用户的姓氏在文件中的某处被加密 - 是正确的)。
4

1 回答 1

3

如果您不存储主密码,则无需对其进行加盐。如果您要重复使用主密码来生成大量一次性密码,则需要根据需要对其进行加密和解密。

加盐用于长期存储必须多次匹配的用户密码,以便具有相同密码的人没有相同的哈希值,这将有助于窃取文件的攻击者。

Salt用于长期存储中的散列,IV用于使用CBC模式(或CTR模式,它也可以称为nonce)进行加密。

至于检查您的文件是否已正确解密,只需确保您使用 PKCS7 之类的填充。当最后一个块被解密时,将检查填充以确保其格式正确。如果解密失败,则填充将无法正确格式化,您应该会收到“填充失败”错误。

于 2011-08-09T12:02:54.663 回答