Зашифруйте с помощью CakePHP 3.0 и расшифруйте с помощью NodeJS

У меня есть сайт администрирования, разработанный на основе CakePHP 3.0, и я использую по умолчанию Security :: encrypt ($ text, $ key, $ hmacSalt = null) зашифровать токен для авторизации API.

У меня также есть простой сервис NodeJS для связи в реальном времени, и я хочу использовать тот же токен для API и для связи в реальном времени.

Я пытаюсь переписать функцию расшифровки CakePHP в NodeJS по-разному, но не могу получить правильные результаты. Ниже приведена функция расшифровки CakePHP:

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

Результат от 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:��"

Вот мой простой код в 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');

Результат от 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

Я пытаюсь создать IV по-разному, но это не работает, даже если мне удается избежать исключения, я не получаю правильный результат, я предполагаю, что проблема в 8-битной кодировке в коде PHP.

Если кто-то знает, как решить эту проблему, я был бы очень благодарен!

-2

Решение

Я не слишком знаком с Node.js, но я вижу, что вы запутываете данные при преобразовании ввода в строку UTF-8, вам нужно работать с двоичными данными, а не со строкой.

Я бы посоветовал работать с буферами до тех пор, пока вам действительно не понадобится преобразовать что-либо в строку, по крайней мере, так я поступил, когда мне пришлось расшифровывать данные, зашифрованные с помощью CakePHP:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]