Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用CakePHP 3.0加密,用NodeJS解密_Php_Node.js_Cakephp_Encryption_Node Crypto - Fatal编程技术网

用CakePHP 3.0加密,用NodeJS解密

用CakePHP 3.0加密,用NodeJS解密,php,node.js,cakephp,encryption,node-crypto,Php,Node.js,Cakephp,Encryption,Node Crypto,我有一个使用CakePHP 3.0框架开发的管理站点,我使用默认值加密API授权的令牌 我还有用于实时通信的简单NodeJS服务,我希望使用相同的令牌进行API和此实时通信 我试图用不同的方法将CakePHP解密函数重写为NodeJS,但无法得到正确的结果。下面是CakePHP解密函数: public static function decrypt($cipher, $key) { $method = 'AES-256-CBC'; $ivSize = op

我有一个使用CakePHP 3.0框架开发的管理站点,我使用默认值加密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的结果:

-----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------
��R�N3U�Y6Q�#��
-----钥匙------
1C494314996AE280BC5981C4E185F79
------密码-----
~a�xh�Z��+���M���

��j*!�(����F�ZG;�)W��吉隆坡��M���Z����ە��或9~���6[X�/��N��B6��C��˟f���!6.��1.���|s��*�镁+���或�韩元��T�;�+�㟱��"��� 我对Node.js不太熟悉,但我可以看到,当您将输入转换为UTF-8字符串时,您需要处理二进制数据,而不是字符串

我建议使用缓冲区,直到您实际需要将某些内容转换为字符串为止,至少当我必须解密使用CakePHP加密的数据时,我是这样做的:

var data = Buffer.from(socket.handshake.query.token, 'base64');
var key = config.tokenKey;
var salt = config.tokenSalt;
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'));