【问题标题】:AES encryption using Php , javascript and vise versa使用 Php、javascript 的 AES 加密,反之亦然
【发布时间】:2017-12-30 09:16:26
【问题描述】:

我正在使用 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);

两者都给出不同的输出。我做错什么了吗?

【问题讨论】:

  • 坚持使用 openssl_encrypt()。最好的方法是 AES-256-CTR,当然也可以使用 16 个字符的 IV。

标签: javascript php encryption cryptography cryptojs


【解决方案1】:
  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 attacks 的攻击。你应该always use authenticated encryption

安全加密的示例类似于this。解密有点复杂。

【讨论】:

  • 好答案。对于未来的读者,还请注意,从 PHP 7.1 开始,支持 GCM 模式的 AES,这可能比 CTR 模式更适合新工作,因为它消除了对 HMAC 的需求。
猜你喜欢
  • 1970-01-01
  • 2017-07-12
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2021-11-10
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多