angular - 使用 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 中执行,它会返回预期结果。
解决方案
我犯了上面的错误。我做了以下事情:
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));
推荐阅读
- javascript - Vue JS - 如何在使用对象单击按钮时更改按钮的背景
- puppeteer - __puppeteer_evaluation_script__ 在 Chrome 开发工具中为空
- docker - Docker Zulip:不使用 nginx 代理设置提供 webpack 捆绑文件
- javascript - 如何让 textareas 在自定义组件中工作?
- php - 为什么 IntelliJ IDEA 在使用 PHP 和 Xdebug 时不会在断点处停止?
- sql - SQL Query Count 用户玩过的游戏数
- swift - 如何在 Swift 中将类树转换为结构树
- r - 由多个实际参数匹配的 R 形式参数“精确”
- macos - /usr/local/bin 中特定二进制文件的符号链接似乎没有生效
- vb.net - 如何将两个或多个 DataTable 连接在一起以在 DataGridView 中显示