Преобразование шифрования OpenSSL и CryptoJS SHA256 - PullRequest
0 голосов
/ 11 декабря 2018

Моя проблема в том, что более новые версии OpenSSL несовместимы с настройками CryptoJS по умолчанию.

Хэш по умолчанию, используемый openssl enc для получения ключа на основе пароля, изменен в 1.1.0 наSHA256 против MD5 в более низких версиях.https://unix.stackexchange.com/questions/344150/why-can-one-box-decrypt-a-file-with-openssl-but-another-one-cant/344586#344586

По умолчанию CryptoJS использует MD5 для получения ключа.OpenSSL использовал MD5, но теперь в версиях OpenSSL> = 1.1.0 он использует SHA256.

Так что, если я передам -md md5 OpenSSL, CryptoJS будет совместим:

echo "Hello World" | openssl enc -aes-256-cbc -md md5 -pass pass:"Secret Passphrase" -e -base64

output: U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=

CryptoJS:

CryptoJS.AES.decrypt('U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);

вывод: "Hello World"


Но теперь, если я хочу использовать SHA256 вместо MD5 (удаление-md md5):

echo "Hello World" | openssl enc -aes-256-cbc -pass pass:"Secret Passphrase" -e -base64

вывод: U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=

CryptoJS:

CryptoJS.AES.decrypt('U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);

вывод: null

Как сделатьЯ приказываю CryptoJS использовать SHA256 вместо MD5 для получения ключа?

1 Ответ

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

Кажется, что CryptoJS "как есть" не обеспечивает такой гибкости.Это связано с тем, что использование MD5 жестко закодировано в функции, используемой для получения ключа из ключевой фразы.Вы можете видеть, что это происходит здесь, в OpenSSLKdf :

var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);

KDF обозначает функцию получения ключа, и при ее создании дайджест не предоставляется.То, что EvpKDF.create() само по себе имеет возможность для различных типов дайджестов, как вы можете видеть в его параметрах конфигурации :

        cfg: Base.extend({
            keySize: 128/32,
            hasher: MD5,
            iterations: 1
        }),

Это также показывает, что MD5 является значением по умолчанию.

Все это подразумевает, что расшифровка будет работать, если вы измените эту первую строку следующим образом:

var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: C_algo.SHA256 }).compute(password, salt);

и, действительно, после редактирования (в качестве теста) этого файла cipher-core.js в вашемлокально установленный модуль, ваша последняя строка кода приводит к желаемому Hello World.

Единственный способ воспроизвести это без изменения самого модуля CryptoJS - это дублировать весь кусок кода из модуля вваш собственный код.

...