3

我正在开发对文件进行 aes256-cbc 加密的简单软件。我正在使用 GNU/Linux 和 libgcrypt-1.5.0。IV 是使用 OpenSSL rand 函数随机生成的,IV 存储在输出文件中的密文之前。我正在使用 PKCS#7 填充方法。

现在我怀疑如何进行:

  1. 最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?

  2. 如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?

4

3 回答 3

3
  1. 两种选择都不正确。您需要使用一种算法来从密码中获取密钥,例如PBKDF2。请参阅函数gcry_kdf_derive
于 2013-01-27T16:30:18.420 回答
3
  1. 按照 indiv 的建议,使用 PBKDF2 派生密钥。
  2. 使用带有不同盐的 PBKDF2 来派生身份验证密钥并将 MAC 附加到您的加密数据(加密后比加密前更安全)。验证MAC以检查密码是否正确,数据是否被篡改。如果您在选择 MAC 时不确定,请使用带有 SHA-512 的 HMAC(假设您根据您的问题使用 AES-256)。

您可以使用 PBKDF2 的单次调用同时生成加密和身份验证密钥,而不是使用两次具有不同填充的 PBKDF2,方法是一次性生成加密密钥和身份验证密钥的组合大小的密钥。

请注意,根据填充来确定密钥是否正确可能会导致 CBC 填充预言攻击。对于文件加密,此类攻击可能不适用,具体取决于具体情况,但无论如何使用适当的 MAC 进行数据身份验证似乎是一种谨慎的做法,因为您还希望防止位翻转攻击和其他对数据的恶意修改。

于 2013-01-27T16:34:48.177 回答
0

1.最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?

您永远不会直接使用“原始”密码作为密钥。需要将密钥拉伸到针对蛮力攻击的加固中。查看字符串到密钥 (S2K) 的东西,或基于密码的密钥派生函数 (PBKDF) 以及像 scrypt 这样的内存硬散列。


2.如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?

不,您使用像 GCM 这样的经过身份验证的加密模式。认证加密模式是专门为该任务构建的,并提供机密性和真实性。

在密码下,加密文件将验证或不会。不要担心自己的原因。否则,您正在设置一个预言机,它可能会撤消步骤 1 中的所有内容(这可能适用于此处,也可能不适用)。

于 2015-03-04T01:49:49.980 回答