为了账号安全,请及时绑定邮箱和手机立即绑定

JS 中的 AES 加密,PHP 中的解密?

JS 中的 AES 加密,PHP 中的解密?

PHP
慕盖茨4494581 2021-10-08 14:38:44
当我的表单被提交时,它会首先向这个控制器动作发出请求以获取服务器的公钥:public function preprocessPayment(Request $request) {    // Get public key    $publicKey = $this->EncryptionService->getPublicKey();    // Generate iv    $method = 'aes-256-cbc';    $ivlen = openssl_cipher_iv_length($method);    $iv = openssl_random_pseudo_bytes($ivlen);    return response()->json([        'success' => true,         'data' => [            'public_key' => $publicKey,            'iv' => $iv        ]    ]);}之后,在我的客户端中,我将通过 CryptoJS 使用 AES 生成一个密钥,稍后将使用public_key.然后,表单数据将使用 AES 密钥在 AES 中加密,然后将以下有效负载提交给服务器:{    secret_key: xxx,    iv: xxx,    form_data: {...}}AES 加密数据将在此处处理:public function storePayment(Request $request) {    // Decrypt AES secret key (that was encrypted with the RSA public key),        // using RSA private key    // Decrypt AES client data with secret key    // Store data in database}我的问题是,我将如何使用 CryptoJS 在客户端进行 AES 密钥生成和加密?似乎找不到任何关于它的好文档。我应该如何格式化数据以便服务器接受它进行解密?而且我坚持在 PHP 中解密 AES,因为它需要一个$tag,而当一切都来自客户端时,我不知道从哪里得到它。$originalData = openssl_decrypt($data, 'aes-128-gcm', $secretKey, $options=0, $iv, $tag);我找到了这个链接:http : //cryptojs.altervista.org/js-php/,但我不确定如何使它工作,因为我不确定在哪里可以找到所需的脚本。编辑:我犯了一个错误,为了在服务器上解密,我使用的aes-128-gcm是aes-256-cbc. 当我更正它时,我能够在没有$tag.
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

AES-256 密钥只不过是 32 个随机字节。因此,您可以使用加密安全的随机数生成器来创建密钥。

但是,RSA PKCS#1 v1.5 和 AES-CBC 都容易受到填充预言机攻击。因此,攻击者不仅可以更改消息,而且消息也不会保密。换句话说,您可以随心所欲地使用 256 位密钥,但您不应该创建自己的传输协议,因为感知的安全性并不存在。

你可以对密文进行签名,但这也有问题——通常我们先签名然后加密。

使用 TLS。


查看完整回答
反对 回复 2021-10-08
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信