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!