4

因此,我正在使用 AES 算法加密文档列表。我使用 PBKDF2 从用户密码中确定密钥。我有几个关于存储数据和 IV/salt 的问题:

如何存储文件:

  • 使用一个 AES 密钥、IV 和 salt 加密所有文档
  • 使用一个 AES 密钥加密每个文档,但将 IV 和 salt 分开

如何存储/检索 IV 和盐:

  • 从 PBKDF2 获取 IV(如 AES 密钥),无需将其存储在某处
  • 在每个文档加密之前生成 IV 并存储为纯文本
  • 对于盐,我认为没有选择 - 无论如何我需要将它存储为纯文本

正如我从那篇文章(http://adamcaudill.com/2013/04/16/1password-pbkdf2-and-implementation-flaws/)和其他一些文章中所理解的那样:

  • 可以将 IV 和 salt 存储为纯文本,因为有时攻击者甚至不需要知道它们
  • 不同的 IV 只能“扭曲”第一个密码块(对于 CBC 模式),但不是全部,因此它不会为 AES 方法带来安全性。
4

1 回答 1

2

每个文件都应该有自己的 IV 和 salt。由于盐值不同,每个文档的 AES 密钥也会不同。您永远不应该使用相同的密钥和 IV 加密两个文档。在最常见的模式 (CBC) 中,重复使用 IV+Key 会导致安全性有所降低。在某些模式 (CTR) 中,重复使用 IV+Key 会破坏加密的安全性。(CTR 中的“IV”称为“nonce”,但在大多数加密 API 中,它通常传递给称为“IV”的东西。)

通常,您随机生成 IV,并将其以纯文本形式存储在文件的开头。如果您使用 PBKDF2 生成 IV,则需要另一种盐(然后无论如何都需要存储),因此没有太大意义。

您还需要记住,最常见的 AES 模式(尤其是 CBC)不提供任何修改保护。如果有人知道您的明文是什么(或者可以猜到它可能是什么),他们可以修改您的密文以解密为他们选择的其他值。(这是文章中“如果在 CBC 模式下解密时 IV 错误,它会损坏第一个块”的实际含义。他们说“损坏”就像它的意思是“垃圾”,但实际上你可以导致第一个块以特定方式腐败。)

解决此问题的方法是使用经过身份验证的加密模式(如 CCM 或 EAX),或者添加 HMAC。

于 2013-10-25T18:20:26.823 回答