c# - 假设盐是随机的,是否可以从密码(与 key )派生初始化 vector ?

标签 c# java encryption cryptography

密码学专家请帮忙。

我了解到使用对称算法(例如 AES)的加密 key 应该通过 PBKDF2 函数从密码派生,在每次加密中使用随机盐。我还了解到 IV 不应该被硬编码,或者直接绑定(bind)到(派生自)密码字符串或加密 key 。到目前为止,我一直在随机生成 key 派生盐 IV,每个 16 字节用于我的 AES-256 加密,并将它们与加密的有效负载一起存储。

现在我认为随机生成 IV 是多余的,如果我使用随机盐,因为我可以使用该盐从密码字符串中导出 key 和 IV。或者我不应该这样做?

所以我的问题最终是这样的:

考虑到我在每次加密中使用随机盐这一事实,我能否从密码中导出初始化 vector (就像我对 key 所做的那样),或者我是否应该每次都生成随机 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);
}

最佳答案

是的,您可以那样使用它,只要您从不对相同的密码使用相同的盐(即使在时间上)来计算 key 和 IV。只有当您使用相同的 key 加密时,IV 才必须是唯一的,并且每次都会计算一个新 key 。原则上,您甚至可以使用全零 IV,因为 key 永远不会重复,但您最好使用派生的。

请注意,如果您的一位同事认为 PasswordDeriveBytes(微软 PBKDF1 的损坏实现)更适合这项任务,那么您很可能容易受到各种攻击。这只是一个示例,如果您的安全边际很紧,可能会出现什么问题……

当然应该首选完全随机的 IV。

关于c# - 假设盐是随机的,是否可以从密码(与 key )派生初始化 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12620249/

相关文章:

c# - 将 BYTE 数组转换为 INT

c# - 测试 url 参数的值,然后从 c# 后面的代码更改 SqlDataSource.SelectCommand

java - 在 eclipse for spring 中运行单元测试时将 src/main/resources 添加到类路径

java - 如何在 Eclipse Java 调试器中跟踪变量的值

php - PHP环境加密私钥存放在哪里

c# - Entity Framework 中的双重自引用

c# - C#中接口(interface)的概念

java - 如何在PDFBox中绘制三角形

php - md5() .vs. 之间有什么不同?保存密码时的哈希值?

encryption - Base64是加密算法还是编码算法?