当我的表单被提交时,它会首先向这个控制器动作发出请求以获取服务器的公钥:
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.
慕村225694