我正在开发对文件进行 aes256-cbc 加密的简单软件。我正在使用 GNU/Linux 和 libgcrypt-1.5.0。IV 是使用 OpenSSL rand 函数随机生成的,IV 存储在输出文件中的密文之前。我正在使用 PKCS#7 填充方法。
现在我怀疑如何进行:
最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?
如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?
我正在开发对文件进行 aes256-cbc 加密的简单软件。我正在使用 GNU/Linux 和 libgcrypt-1.5.0。IV 是使用 OpenSSL rand 函数随机生成的,IV 存储在输出文件中的密文之前。我正在使用 PKCS#7 填充方法。
现在我怀疑如何进行:
最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?
如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?
您可以使用 PBKDF2 的单次调用同时生成加密和身份验证密钥,而不是使用两次具有不同填充的 PBKDF2,方法是一次性生成加密密钥和身份验证密钥的组合大小的密钥。
请注意,根据填充来确定密钥是否正确可能会导致 CBC 填充预言攻击。对于文件加密,此类攻击可能不适用,具体取决于具体情况,但无论如何使用适当的 MAC 进行数据身份验证似乎是一种谨慎的做法,因为您还希望防止位翻转攻击和其他对数据的恶意修改。
1.最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?
您永远不会直接使用“原始”密码作为密钥。需要将密钥拉伸到针对蛮力攻击的加固中。查看字符串到密钥 (S2K) 的东西,或基于密码的密钥派生函数 (PBKDF) 以及像 scrypt 这样的内存硬散列。
2.如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?
不,您使用像 GCM 这样的经过身份验证的加密模式。认证加密模式是专门为该任务构建的,并提供机密性和真实性。
在密码下,加密文件将验证或不会。不要担心自己的原因。否则,您正在设置一个预言机,它可能会撤消步骤 1 中的所有内容(这可能适用于此处,也可能不适用)。