2017-05-29 5 views
-2

Ich habe Verwaltungs-Website mit CakePHP 3.0 Framework entwickelt und ich verwende standardmäßig Security::encrypt($text, $key, $hmacSalt = null), um Token für API-Autorisierung zu verschlüsseln.Verschlüsseln mit CakePHP 3.0 und entschlüsseln mit NodeJS

Ich habe auch einfache NodeJS-Dienst für Echtzeit-Kommunikation und ich möchte das gleiche Token für API und diese Echtzeit-Kommunikation verwenden.

Ich versuche CakePHP Entschlüsselungsfunktion zu NodeJS auf verschiedene Arten neu schreiben, aber ich kann nicht die richtigen Ergebnisse erhalten. Im Folgenden wird entschlüsseln CakePHP Funktion:

public static function decrypt($cipher, $key) 
    { 
     $method = 'AES-256-CBC'; 
     $ivSize = openssl_cipher_iv_length($method); 

     $iv = mb_substr($cipher, 0, $ivSize, '8bit'); 

     echo "---- IV --- \r\n"; 
     var_dump($iv); 

     $cipher = mb_substr($cipher, $ivSize, null, '8bit'); 

     echo "---- KEY --- \r\n"; 
     var_dump($key); 

     echo "---- CIPHER LAST --- \r\n"; 
     var_dump($cipher); 

     return openssl_decrypt($cipher, $method, $key, OPENSSL_RAW_DATA, $iv); 
    } 

Ergebnis aus CakePHP:

---- IV --- 
string(16) "��r�N3U�Y6Q�#��" 
---- KEY --- 
string(32) "1c494314996afe280bc5981c4e185f79" 
---- CIPHER LAST --- 
string(160) "~a�xh�z��+���M����j*!�(����f�ZG;�)w��Kl�3�m��Z��ە��OR9~���6[X�/��n��B6��C��˟f��!6��1���|S��*�mG+���OR�kr��t�;�+�㟱��"���<i����e:��" 

Hier ist mein einfacher Code in NodeJS:

var buf = new Buffer(socket.handshake.query.token, 'base64').toString('utf8', 64); 
var iv = buf.substr(0,16); 

console.log("-----IV------") 
console.log(iv); 

var key = sha256(config.tokenKey+config.tokenSalt).substr(0,32); 
console.log("-----KEY------") 
console.log(key); 

var cipher = buf.substr(16); 

console.log("------CIPHER-----"); 
console.log(cipher); 

var decipher = crypto.createDecipheriv('AES-256-CBC', key, iv); 
//decipher.setAutoPadding(false); 
var dec = decipher.update(cipher); 
dec += decipher.final('utf-8'); 

Ergebnis aus NodeJS:

-----IV------ 
��r�N3U�Y6Q�#�� 
-----KEY------ 
1c494314996afe280bc5981c4e185f79 
------CIPHER----- 
~a�xh�z��+���M��� 
       ��j*!�(����f�ZG;�)w��Kl��m���Z����ە��OR9~���6[X�/��n��B6��C��˟f���!6��1���|S��*�mG+���OR�kr��t�;�+�㟱��"���<i����e:�� 
crypto.js:239 
    this._handle.initiv(cipher, toBuf(key), toBuf(iv)); 
Error: Invalid IV length 

Ich versuche IV anders zu erstellen Wege, aber es funktioniert nicht, auch wenn es mir gelingt, Ausnahme zu vermeiden, ich bekomme kein korrektes Ergebnis, ich nehme an, dass das Problem in "8bit" Codierung in PHP-Code ist.

Wenn jemand weiß, wie man das löst, wäre ich sehr dankbar!

Antwort

0

Ich bin nicht vertraut mit Node.js, aber was ich sehe ist, dass Sie die Daten vermasseln, wenn Sie die Eingabe in eine UTF-8-Zeichenfolge konvertieren, müssen Sie mit Binärdaten arbeiten, nicht mit einem Zeichenfolge.

Ich würde vorschlagen, mit Puffern arbeiten, bis man tatsächlich etwas in eine Zeichenfolge konvertieren müssen, zumindest das ist, wie ich es tat, als ich Daten entschlüsseln musste, die mit CakePHP verschlüsselt wurde:

var data = Buffer.from(socket.handshake.query.token, 'base64'); 
var key = config.tokenKey; 
var salt = config.tokenSalt; 
var hmacSize = 64; 
var ivSize = 16; 
var keySize = 32; 

var encrypted = data.slice(hmacSize); 

key = crypto 
    .createHash('sha256') 
    .update(key + salt) 
    .digest('hex') 
    .substr(0, keySize); 

var iv = encrypted.slice(0, ivSize); 

encrypted = encrypted.slice(ivSize); 

var decipher = crypto.createDecipheriv('AES-256-CBC', key, iv); 
var decrypted = Buffer.concat([ 
    decipher.update(encrypted), 
    decipher.final() 
]); 

console.log(decrypted.toString('utf8')); 
Verwandte Themen