当我的表单提交时,它将首先向此控制器操作发出请求,以获取服务器的公钥:
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的情况下解密。
发布于 2019-07-14 16:57:12
一个AES-256键只不过是32个随机字节.因此,您可以使用加密安全的随机数生成器来创建密钥。
然而,RSA PKCS#1 v1.5和AES-CBC都容易受到填充甲骨文的攻击.因此,不仅对手可以改变信息,信息也是不保密的。换句话说,您可以任意使用256位密钥,但不应该创建自己的传输协议,因为感知到的安全性根本不存在。
你可以在密文上签名,但这也有问题--一般情况下,我们先签字后加密。
使用TLS。
https://stackoverflow.com/questions/57025639
复制相似问题