当我的表单被提交时,它会首先向这个控制器动作发出请求以获取服务器的公钥: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。
- 1 回答
- 0 关注
- 168 浏览
添加回答
举报
0/150
提交
取消