簡體   English   中英

AES 加密使用 Php , javascript 反之亦然

[英]AES encryption using Php , javascript and vise versa

我正在使用 javascript 和服務器端使用 PHP 進行客戶端加密。 我們雙方都使用相同的密鑰和 IV。

PHP加密:

$string='test data';

$output = '';
    $encrypt_method = 'AES-256-CBC';
    $secret_key     = 'secret key in hex';
    $secret_iv      = 'iv in hex';
    $key            = hash('sha256',$secret_key);

$output   = openssl_encrypt($string,$encrypt_method,$key,0,$initialization_vector);

//Encrypted text in php
$output   = base64_encode($output);

Javascript 加密代碼:

var key = 'secret key in hex';
key = CryptoJS.SHA256(key);            
var ivHex = CryptoJS.enc.Hex.parse(' IV in hex ');            
var options = { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv:ivHex};
var obj='test data';
var encrypted = CryptoJS.AES.encrypt(obj,key ,options);
var encryptedBase64 = encrypted.toString();

//Encrypted text in javascript    
console.log(encryptedBase64);

兩者都給出不同的輸出。 我做錯了什么嗎?

  1. $secret_iv已定義,但在openssl_encrypt()使用了未定義的$initialization_vector
  2. 對於第四個參數,您不想傳遞0 ,而是希望傳遞OPENSSL_RAW_DATA (一個常量)。
  3. 您在 PHP 中傳遞hash('sha256', $secret_key)但在 Javascript 中直接使用secret_key
    • 注意:您的密鑰推導( hash('sha256', $some_text_input) )非常弱。 請考慮 PBKDF2-SHA256。

重要提示:沒有 HMAC 的 AES-CBC 容易受到padding-oracle 攻擊 您應該始終使用經過身份驗證的加密

安全加密的示例如下所示 解密涉及更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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