首页 > 解决方案 > 使用 Laravel 和 Angular 6 在 CryptoJs 中面临盐中的问题

问题描述

在 Laravel5 中,我通过以下 salt 对消息进行了加密,并在 API 中使用 base64 编码传递了 salt 值:

    $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 中执行,它会返回预期结果。

标签: angularlaravelcryptojs

解决方案


我犯了上面的错误。我做了以下事情:

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

注意,我也删除了 atob 函数。

所以不是Utf8,应该是Base64。因此,Angular 代码将是:

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));

推荐阅读