security - 使用 PKBDF2、AES、IV 和 salt 进行更好的实践

标签 security encryption aes pbkdf2

所以,我正在使用 AES 算法加密文档列表。我使用 PBKDF2 从用户密码确定 key 。我有一些关于存储数据和 IV/盐的问题:

如何存储文档:

  • 使用一个 AES key 、IV 和盐加密所有文档
  • 使用一个 AES key 加密每个文档,但使用单独的 IV 和 salt

如何存储/检索 IV 和盐:

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

据我从那篇文章( http://adamcaudill.com/2013/04/16/1password-pbkdf2-and-implementation-flaws/ )和其他一些文章中了解到:

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

最佳答案

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

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

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

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

关于security - 使用 PKBDF2、AES、IV 和 salt 进行更好的实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19594140/

相关文章:

javascript - 将 OpenSSL 命令行 AES 加密映射到等效的 NodeJS Crypto API

java - 将 java 中的加密代码转换为 Ruby

html - 如何在避免 GUID 的同时防止我的 HTML 被利用?

encryption - 要编码的 RSA 最大块大小是多少?

java - Rails 和 Java 的通用加密算法

android - PHP - Openssl_decrypt 错误 : wrong final block length (AES 256 CBC mode encryption/decryption)

iOS:我需要将用户的私钥 (RSA) 传输到我的应用程序。文件共享是一个好的解决方案吗?

android - 如何在 Android Oreo 中管理来自未知来源的安装?

powershell - 恶意软件使用 .Lnk 文件到 Powershell

node.js - 如何避免 bcrypt-node 向 URL 字符串哈希添加斜杠?