簡體   English   中英

JS中的AES加密,PHP中的解密?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM