Ответ 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
.