node.js - 节点 - 生成 AES-CBC 密钥和 iv
问题描述
我试图让 nodejs 运行相当于
openssl enc -aes-192-cbc -k secret -P -md sha1
也就是说,生成一个与其他需要 AES CBC 的工具兼容的密钥/iv 对。
我可以尝试实际openssl
作为 shell 命令运行,但我希望有一种更多的节点原生方式来执行此操作。
我可以生成 2 个正确长度的随机十六进制吗?一个用于iv,一个用于key?
解决方案
我试图让 nodejs 运行相当于
openssl enc -aes-192-cbc -k secret -P -md sha1
如果您真的想在节点中重现此命令的密钥/iv 生成方面,您可以使用一些 OpenSSL 密钥派生代码作为crypto-js/cipher-core.js
示例。例如,它将利用EvpKDF
如下方式。
var Crypto = require("crypto-js");
var password = 'secret'
var salt = Crypto.lib.WordArray.random(64 / 8);
var keySize = 192 / 32;
var ivSize = 128 / 32;
var key = Crypto.algo.EvpKDF.create({ keySize: keySize + ivSize, hasher: Crypto.algo.SHA1 }).compute(password, salt);
var iv = Crypto.lib.WordArray.create(key.words.slice(keySize), ivSize * 4);
key.sigBytes = keySize * 4;
console.log("salt="+salt.toString().toUpperCase());
console.log("key="+key.toString().toUpperCase());
console.log("iv="+iv.toString().toUpperCase());
这模仿了 OpenSSL 的密钥派生功能。请注意,它应用随机盐来防止字典攻击。
运行这两个命令来证明它们是等价的,首先是上面的节点脚本:
$ node ./osslkdf.js
salt=AFB2196A330BB67A
key=72DE44ADC3F86856BCBB5E5F01BC3D06178F0B61261550DE
iv=38D9942317D965C36C82CC7CFA1F48E7
然后是 OpenSSL:
$ openssl enc -aes-192-cbc -k secret -P -md sha1 -S AFB2196A330BB67A
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
salt=AFB2196A330BB67A
key=72DE44ADC3F86856BCBB5E5F01BC3D06178F0B61261550DE
iv =38D9942317D965C36C82CC7CFA1F48E7
请注意,必须明确给出盐以重现完全相同的结果。通常,盐值将与密文一起存储。当然,密码短语 ( 'secret'
) 必须保密。
推荐阅读
- python - 在 Thread 构造函数中定义 `args` 的更好方法?
- android - 对包含字符串值的 Mediastore 轨道号进行排序时出现问题
- biztalk-2016 - BizTalk - 设置电子邮件 contentType 导致错误:XML 文档中存在错误 (1, 1)
- python-3.8 - 检查字符串索引时“==”与“in”或“if in”之间有什么实际区别吗?
- python - 将多个 yaml 文件读取到 pandas Dataframe
- javascript - 如何为 HTML 中动态添加的元素添加索引?
- asp.net-core - 带有 ViewModel 无参数构造函数的 ASP.NET Core 3.1 DI
- laravel - Sanctum 和 Postman 的 SPA 身份验证问题
- flyway - 航路迁移不工作需要维修
- hyperledger-fabric - 为什么在超级账本中部署链码不起作用?