[英]AES encryption in JS, decrypt in PHP?
提交表單后,它將首先向此控制器操作發出請求以獲取服務器的公鑰:
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
即可解密。
AES-256密鑰不過是32個隨機字節。 因此,您可以使用加密安全的隨機數生成器來創建密鑰。
但是,RSA PKCS#1 v1.5和AES-CBC都容易受到填充Oracle攻擊。 因此,不僅對手可以更改消息,而且消息也不會保密。 換句話說,您可以根據需要使用256位密鑰,但是您不應創建自己的傳輸協議,因為感知的安全性還不存在。
您可以對密文進行簽名,但這也有問題-通常我們先簽名然后進行加密。
使用TLS。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.