gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:10 25 4
gpt4 key购买 nike

密码学专家请帮忙。

我了解到使用对称算法(例如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com