请密码学大师帮忙。
我了解到,使用对称算法(例如 AES)的加密密钥应该通过 PBKDF2 函数从密码中派生,在每次加密中使用随机盐。我还了解到 IV 不应该是硬编码的,也不应该直接绑定到(派生自)密码字符串或加密密钥。到目前为止,我一直在随机生成密钥派生 salt和IV,每个 16 个字节用于我的 AES-256 加密,并将它们与加密的有效负载一起存储。
现在我认为IV的随机生成是多余的,如果我使用随机盐,因为我可以使用该盐从密码字符串中导出密钥和IV。或者也许我不应该?
所以我的问题最终是这样的:
我可以从密码中导出初始化向量(就像我使用密钥一样),还是每次都应该生成随机 IV,因为我在每次加密中都使用随机盐?
那么我可以使用下面的 C# 代码吗?
// Derive key and initialization vector from password:
// ---> NOTE: _salt is random 16 bytes in each encryption.
byte[] key, iv;
using (Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, _salt, _iterations))
{
key = derivedBytes.GetBytes(32);
iv = derivedBytes.GetBytes(16);
}