Узел - Создать ключ AES-CBC и iv - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь заставить 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

То есть генерировать ключ / ivпара, которая будет совместима с другими инструментами, которые ожидают AES CBC.

Я мог бы попытаться на самом деле запустить openssl как команду оболочки, но я надеюсь, что есть более нативный способ сделать это.

Могу ли я сгенерировать 2 случайных гекса правильной длины?Один для iv и один для ключа?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Я пытаюсь заставить 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') нужно держать в секрете.

0 голосов
/ 17 декабря 2018

Я добавляю свой собственный ответ, используя новые API-интерфейсы NodeJS, доступные в v10:

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

Это генерирует пару ключей и iv, совместимую с AES-128-CBC

0 голосов
/ 12 декабря 2018

Вам нужны некоторые случайные данные правильного размера для ключа и некоторые уникальные данные для IV (должен быть уникальным только при использовании с этим конкретным ключом).

Если вы используете случайные данные для IV, вы можете предположить, что требование уникальности выполнено.

Вам понадобится безопасный генератор случайных чисел специально для шифрования - взгляните на: crypto.randomBytes(...)

...