提交表单后,它将首先向此控制器操作发出请求以获取服务器的公钥:
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
就可以解密。
答案 0 :(得分:1)
AES-256密钥不过是32个随机字节。因此,您可以使用加密安全的随机数生成器来创建密钥。
但是,RSA PKCS#1 v1.5和AES-CBC都容易受到填充Oracle攻击。因此,不仅对手可以更改消息,而且消息也不会保密。换句话说,您可以随意使用256位密钥,但是您不应该创建自己的传输协议,因为 perceptable 安全性不存在。
您可以对密文进行签名,但这也有问题-通常我们先签名然后进行加密。
使用TLS。