2017-01-22 88 views
2

在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上中繼,因此您可以期望算法具有良好的兼容性。 –

回答

3

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的兼容性,然後如果輸出保持變化? –