【问题标题】:Encrypt in PHP 7 decrypt in Node JS在 PHP 7 中加密 在 Node JS 中解密
【发布时间】:2017-01-22 15:41:22
【问题描述】:

在 PHP 5.6 中有很多基于 http://php.net/manual/en/function.mcrypt-decrypt.php 的完美解决方案

例如

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 有一个 WARNING 不鼓励使用这个函数。

“自 PHP 7.1.0 起,该函数已被弃用。强烈建议不要依赖此函数。”

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

【问题讨论】:

标签: php node.js encryption php-7


【解决方案1】:

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

【讨论】:

  • 这为最近的 3 个 PHP7 版本提供了 3 个不同的输出,这在节点 js 上解密时很奇怪并且不常见
  • 当然——即使您在每次新运行时都使用一个版本的 PHP,输出也会不同(因为初始化向量 - iv)——这是强密码学的关键目标。您只需要在 nodejs 和 php 中为 $secretHash 变量设置一些静态键。
  • 如果输出不断变化,如何保持与node js的兼容性?
  • 好的。已接受的挑战。我用 node.js 部分更新了答案。我在 php 中设置了持久密钥(注意 php 链接也更新了)你可以用任何一个 PHP 链接输出替换数据并查看密码学的魔法)
  • 像魅力一样工作,在我接受您的回答之前让我听听其他意见。谢谢
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 2016-02-03
  • 2013-11-10
  • 2019-03-04
  • 1970-01-01
  • 2012-05-23
  • 2019-10-02
  • 2012-05-19
相关资源
最近更新 更多