节点-生成AES-CBC密钥和iv

时间:2018-12-12 13:39:54

标签: node.js encryption aes

我正在尝试让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,一个用于密钥?

3 个答案:

答案 0 :(得分:1)

  

我正在尝试让nodejs运行等效的

     

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

如果您确实想在节点中重现此命令的密钥/ iv生成方面,则可以使用一些OpenSSL密钥派生代码found in 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')必须保密。

答案 1 :(得分:0)

您需要的是密钥的正确大小的一些随机数据,以及IV的一些唯一数据(仅当与特定密钥一起使用时才需要唯一)键)。

如果对IV使用随机数据,则可以假设要满足唯一性要求。

您将需要一个专门用于加密的安全随机生成器-看一下:crypto.randomBytes(...)

答案 2 :(得分:0)

我使用第10版中可用的新NodeJS API添加自己的答案:

let passphrase = "some passphrase"
let iv = crypto.randomBytes(16); // Initialization vector.
let salt = crypto.randomBytes(16);
let key = crypto.scryptSync(passphrase, salt, 16);

这将生成与AES-128-CBC兼容的密钥和iv对