Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点-生成AES-CBC密钥和iv_Node.js_Encryption_Aes - Fatal编程技术网

Node.js 节点-生成AES-CBC密钥和iv

Node.js 节点-生成AES-CBC密钥和iv,node.js,encryption,aes,Node.js,Encryption,Aes,我试图让nodejs运行与 openssl enc-aes-192-cbc-k secret-p-md sha1 如下所述: 也就是说,生成一个密钥/iv对,该对将与预期AES CBC的其他工具兼容 我可以尝试将openssl作为一个shell命令来运行,但我希望有一种更为节点原生的方式来运行 我可以生成2个正确长度的随机十六进制吗?一个用于iv,一个用于key?您需要的是一些密钥大小正确的随机数据,而iv的一些唯一数据仅在与特定密钥一起使用时才需要是唯一的 如果对IV使用随机数据,则可以假定满

我试图让nodejs运行与

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

如下所述:

也就是说,生成一个密钥/iv对,该对将与预期AES CBC的其他工具兼容

我可以尝试将openssl作为一个shell命令来运行,但我希望有一种更为节点原生的方式来运行

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

您需要的是一些密钥大小正确的随机数据,而iv的一些唯一数据仅在与特定密钥一起使用时才需要是唯一的

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

您需要一个专门用于加密的安全随机生成器-请看:

我试图让nodejs运行与

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

如果您确实希望在node中重现该命令的key/iv生成方面,可以使用一些OpenSSL密钥派生代码作为示例。例如,它将利用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的密钥派生功能。请注意,它应用随机salt来防止字典攻击

运行这两个命令以证明它们是等效的,首先是上面的节点脚本:

$ 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

注意,必须明确给出盐以再现完全相同的结果。通常,salt值将与密文一起存储。密码短语“secret”当然必须保密。

我正在使用v10中提供的新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对