加密在节点JS PHP 7解密

问题描述:

在PHP 5.6有很多是非常完美的解决方案是基于http://php.net/manual/en/function.mcrypt-decrypt.php加密在节点JS PHP 7解密

是例如

public function encrypt($data) 
{ 
    //don't use default php padding which is '\0' 
    $pad = $this->blocksize - (strlen($data) % $this->blocksize); 
    $data = $data . str_repeat(chr($pad), $pad); 
    return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
     $this->encryptKey, 
     $data, MCRYPT_MODE_CBC, $this->iv)); 
} 

但PHP7有警告不鼓励使用这个功能。

“这个函数从PHP 7.1.0开始已经被取消了,依靠这个函数是非常不鼓励的。”

使用两端关键字进行安全加密的任何想法; PHP + Node.js?

+0

这就解释了为什么其弃用​​,并就如何改用建议http://php.net/manual/en/migration71.deprecated.php – RiggsFolly

+0

尝试使用'openssl_encrypt' http://php.net/manual/en/function.openssl-encrypt.php –

+0

建议使用openssl,而不是只是因为LibMcrypt已被弃用,而且因为NodeJS Crypto模块在openssl上中继,因此您可以期望算法具有良好的兼容性。 –

LibMcrypt是在2007年的更多信息被遗弃https://wiki.php.net/rfc/mcrypt-viking-funeral

你必须使用的OpenSSL加密http://php.net/manual/en/function.openssl-encrypt.php

PHP

<?php 
$textToEncrypt = "Secret Text to Encrypt"; 
$encryptionMethod = 'aes-256-cbc'; 
$secretHash = "315a5504d921f8327f73a356d2bbcbf1"; // <---- you have to use some persistent key. 

$iv_size = openssl_cipher_iv_length($encryptionMethod); 
$iv = openssl_random_pseudo_bytes($iv_size); 

//To encrypt 
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv); 

//Concatenate iv with data 
$encryptedMessageWithIv = bin2hex($iv) . $encryptedMessage; 

//To Decrypt 
$iv_size = openssl_cipher_iv_length($encryptionMethod); 
$iv = hex2bin(substr($encryptedMessageWithIv, 0, $iv_size * 2)); 

$decryptedMessage = openssl_decrypt(substr($encryptedMessageWithIv, $iv_size * 2), $encryptionMethod, $secretHash, 0, $iv); 

echo "Encrypted: $encryptedMessageWithIv <br>Decrypted: $decryptedMessage"; 

尝试在这里https://3v4l.org/r9pYv

周的Node.js(我真的不使Node.js的程序员,可以有更有效的方法)

var data = "ad699a2537ec2a7f699acbf97ca0080eh3z5EgvnTAvlc76YeR6HdWPmkDDt+pHiG//qo7xnqyQ="; 
var key = "315a5504d921f8327f73a356d2bbcbf1"; 
var iv = new Buffer(data.substring(0,32), 'hex'); 
var dec = crypto.createDecipheriv('aes-256-cbc',key,iv); 
var decrypted = Buffer.concat([dec.update(new Buffer(data.substring(32),'base64')), dec.final()]); 
console.log('DECRYPTED TEXT: '+decrypted.toString()); 

试一下:https://repl.it/FQyo/2

+0

这为3个最新的PHP7版本提供了3个不同的输出,这在解决js节点问题时很奇怪,并不常见。 –

+0

当然 - 即使您在每次新的运行中使用一个版本的PHP,它也会是不同的输出(因为初始化矢量 - iv) - 这是强密码学的关键目标。 你只需要在nodejs和php中为$ secretHash变量设置一些静态键。 – vuliad

+0

如何保持与节点js的兼容性,然后如果输出保持变化? –