gpt4 book ai didi

node.js - crypto.pbkdf2 派生 IV 和 key 到 crypto.createCipheriv 的正确设置是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:51 29 4
gpt4 key购买 nike

在 node.js 的应用程序中,我使用 crypto module用于对称加密/解密。

我正在使用 AES-256-CTR。我最初假设 crypto.createCipher将“只是工作”和“挥手”的细节。现在我正在阅读文档:

Note: createCipher derives keys with the OpenSSL function EVP_BytesToKey with the digest algorithm set to MD5, one iteration, and no salt. The lack of salt allows dictionary attacks as the same password always creates the same key. The low iteration count and non-cryptographically secure hash algorithm allow passwords to be tested very rapidly.

In line with OpenSSL's recommendation to use pbkdf2 instead of EVP_BytesToKey it is recommended you derive a key and iv yourself with crypto.pbkdf2 and to then use createCipheriv() to create the cipher stream.

好吧,我可以自己导出 IV 和 key 。

但是,我不确定,这样做的正确和推荐方法是什么 - 我是否应该使用不同的盐分别对两者进行 key 推导?我应该做一个 key 推导然后减半吗?对于这个特定的用例,我应该完全使用盐吗?我应该随机生成盐并将其与数据一起保存吗?

最佳答案

should I do key derivation separately for both, with different salts?

您当然可以这样做,但是具有大致相同安全性的更快的替代方法是使用如下内容:

var master = crypto.pbkdf2Sync(password, randomSalt, 60000, 256, 'sha256');
var hmac = crypto.createHmac('sha256', master);
hmac.update("key");
var key = hmac.digest();

hmac = crypto.createHmac('sha256', master);
hmac.update("nonce");
var nonce = hmac.digest().slice(0,12); // 96 bit for CTR nonce

Should I do one key derivation and then cut it in half?

请求比底层哈希函数提供更多的输出字节是有问题的。如果您想要一个 AES-256 key (256 位)和一个 64 到 128 位的随机数 (IV),那么您需要使用 SHA-384 (sha384) 或 SHA-512 (sha512) 作为基础 摘要 均由 node.js 提供。

Should I randomly generate the salt and save it with the data?

是的,您需要将盐与密文一起发送,以便接收方可以使用他们拥有的密码和盐来生成相同的 key +随机数。

也许您指的是随机数本身。这是第三种选择,您必须随机生成随机数并将其与随机(加密)盐和密文一起存储。

结论

上述所有方法提供的安全性大致相同,但它们在密文中包含的内容和额外的计算时间方面有所不同。我建议使用最简单的方法,因为 ...

您还应该实现密文身份验证。如果您不这样做,那么您的系统可能容易受到填充 oracle 攻击。

您可以将第一个建议与附加 key 一起用于加密然后 MAC 解决方案,如下所示:

hmac = crypto.createHmac('sha256', master);
hmac.update("hmac");
var hmacKey = hmac.digest();

// TODO encrypt

hmac = crypto.createHmac('sha256', hmacKey);
hmac.update(ciphertext);
var authenticationTag = hmac.digest();

然后您还需要在密文中包含身份验证标签,并在解密之前检查它在接收方是否匹配。

您还可以使用 node.js 支持的 GCM 等身份验证模式。

关于node.js - crypto.pbkdf2 派生 IV 和 key 到 crypto.createCipheriv 的正确设置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963624/

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