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

问题描述 投票:2回答:1

我正在使用PHP使用javascript和服务器端进行客户端加密。我们双方都使用相同的密钥和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);

两者都提供不同的输出。我做错了吗?

javascript php encryption cryptography cryptojs
1个回答
1
投票
  1. $secret_iv已定义,但在$initialization_vector中使用了未定义的openssl_encrypt()
  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 attacks攻击。你应该always use authenticated encryption

安全加密的一个例子看起来像this。解密更多一些。

© www.soinside.com 2019 - 2024. All rights reserved.