Столкнувшись с проблемой соли в CryptoJs с Laravel и Angular 6 - PullRequest
0 голосов
/ 04 января 2019

В Laravel5 я зашифровал сообщение с помощью следующей соли и передал значение соли в API с кодировкой base64:

    $data = [];
    $cipher = env('APP_CIPHER'); // AES-256-CBC
    $iv = random_bytes(openssl_cipher_iv_length($cipher));
    $key = env('APP_KEY'); // XXXXXZNUK5nhIMBbBEwKISqQ9ioXXXXX
    $value = \openssl_encrypt(
        json_encode($response),
        $cipher, $key, 0, $iv
    );
    $data['data'] = $value;
    $data['salt'] = base64_encode($iv);

    return $data;

В Angular 6 я хочу расшифровать сообщение. Я сделал следующий код, но он показывает мне malformed utf-8 data:

var key = CryptoJS.enc.Utf8.parse('XXXXXZNUK5nhIMBbBEwKISqQ9ioXXXXX');
var salt = atob(this.countryList.response.salt);
var iv = CryptoJS.enc.Utf8.parse(salt);
var decrypted = CryptoJS.AES.decrypt(this.countryList.response.data, key, {
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8));

Сообщение / значения сохраняются в this.countryList.response.data

Значение соли в кодировке base64, которое я получил в this.countryList.response.salt.

Любая ошибка в моем коде?

Обратите внимание: если я наберу $iv = '1212121212121212'; в Laravel и наберу var salt = '1212121212121212'; в Angular, он вернет ожидаемый результат.

1 Ответ

0 голосов
/ 04 января 2019

Я сделал ошибку, как указано выше. Я сделал следующее:

var salt = (this.countryList.response.salt);
var iv = CryptoJS.enc.Base64.parse(salt);

Обратите внимание, я также удалил функцию atob.

То есть вместо Utf8 должно быть Base64. Итак, Угловой код будет:

var key = CryptoJS.enc.Utf8.parse('XXXXXZNUK5nhIMBbBEwKISqQ9ioXXXXX');
var salt = (this.countryList.response.salt);
var iv = CryptoJS.enc.Base64.parse(salt);
var decrypted = CryptoJS.AES.decrypt(this.countryList.response.data, key, {
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8));
...