2017-12-30 37 views
1

PHPを使用してJavaScriptおよびサーバー側を使用してクライアント側の暗号化を行っています。両側で同じキーとIVを使用しています。PHP、JavaScript、およびその逆を使用したAES暗号化

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); 

の両方が異なる出力を与えています。私は間違って何かしていますか?

+0

openssl_encrypt()に固執します。最良の方法はAES-256-CTRで、もちろん16文字のIVを使用します。 – halojoy

答えて

1
    ​​3210
  1. が定義されているが、不定$initialization_vectoropenssl_encrypt()に使用されます。
  2. 第4引数の場合、0を渡したくない場合は、OPENSSL_RAW_DATA(定数)を渡します。
  3. hash('sha256', $secret_key)をPHPに渡していますが、secret_keyをJavascriptで直接使用しています。
    • 注:キーの派生(hash('sha256', $some_text_input))は非常に弱いです。代わりにPBKDF2-SHA256を検討してください。

重要:HMACのない AES-CBCはpadding-oracle attacksに対して脆弱です。 always use authenticated encryptionです。

安全な暗号化の例は、thisのようになります。復号化はもう少し複雑です。

+1

良い答え。今後の読者には、PHP 7.1以降、GCMモードのAESもサポートされていることに注意してください。これはCTRモードよりも新作に適していると思われます。これはHMACの必要性を排除するからです。 –

関連する問題