Преобразование шифрования OpenSSL и CryptoJS SHA256

Моя проблема в том, что более новые версии 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

вывод: U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=

КриптоJS:

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=

КриптоJS:

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

вывод: ноль

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


person Iloy Gres    schedule 11.12.2018    source источник


Ответы (1)


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

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

KDF расшифровывается как Key Derivation Function, и при его создании дайджест не предоставляется. Этот 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, скопировав весь фрагмент кода из модуля в свой собственный код.

person Reinier Torenbeek    schedule 11.12.2018