Что не так с расшифровкой шифрования nodejs? - программирование

Что не так с расшифровкой шифрования nodejs?

У меня есть следующие зашифрованные данные:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

Передача для расшифровки: password

(это пример из gibberish-aes)

В командной строке с помощью openssl:

echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | openssl enc -d -aes-256-cbc -a -k password

Вывод:

Made with Gibberish\n

С моим приложением NodeJS:

  var decipher = crypto.createDecipher('aes-256-cbc', "password");
  var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o",
     'base64', 'utf8');
  dec += decipher.final('utf8');

У меня есть следующая ошибка TypeError: DecipherFinal fail в строке decipher.final.

Я что-то упустил? Спасибо.

4b9b3361

Ответ 1

Зашифрованные данные начинаются с 8-байтовой "магии", указывающей, что есть соль (ASCII-кодирование "Salted__"). Затем следующие 8 байтов - соль. Теперь плохие новости: Node.js, похоже, не использует соль для метода EVP_BytesToKey:

int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL,
  (unsigned char*) key_buf, key_buf_len, 1, key, iv);

То, что NULL - соль.

Это было проверено с использованием тестового приложения Java (с использованием правильной соли) - возвращалась строка результатов.

Пожалуйста, оставьте соль, используя переключатель OpenSSL -nosalt, и повторите попытку.

[Пример]

OpenSSL CLI:

openssl enc -aes-256-cbc -nosalt -a -k password
owlstead
Mh5yxIyZH+fSMTkSgkLa5w==

Критерий NodeJS:

var crypto=require('crypto')
var cipher=crypto.createDecipher('aes-256-cbc', "password")
var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8')
enc += cipher.final('utf8')

[ПОСЛЕДНИЙ РЕДАКТИРОВАТЬ] Обратите внимание, что использование секретного ключа с солью и большим рабочим фактором может иметь первостепенное значение для безопасности. Вам лучше использовать очень уникальный, высокий энтропийный пароль, иначе ваши зашифрованные данные могут оказаться под угрозой.


[ДЕЙСТВИТЕЛЬНО ПОЗДНЕЕ ИЗМЕНЕНИЕ] OpenSSL 1.1.0c изменил алгоритм дайджеста, используемый в некоторых внутренних компонентах. Раньше использовался MD5, а 1.1.0 - SHA256. Будьте осторожны, это изменение не влияет на вас как на EVP_BytesToKey, так и на команды типа openssl enc.