首页 > 解决方案 > 节点 - 生成 AES-CBC 密钥和 iv

问题描述

我试图让 nodejs 运行相当于

openssl enc -aes-192-cbc -k secret -P -md sha1

如此处所述:https ://www.ibm.com/support/knowledgecenter/en/SSLVY3_9.7.0/com.ibm.einstall.doc/topics/t_einstall_GenerateAESkey.html

也就是说,生成一个与其他需要 AES CBC 的工具兼容的密钥/iv 对。

我可以尝试实际openssl作为 shell 命令运行,但我希望有一种更多的节点原生方式来执行此操作。

我可以生成 2 个正确长度的随机十六进制吗?一个用于iv,一个用于key?

标签: node.jsencryptionaes

解决方案


我试图让 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') 必须保密。


推荐阅读