1

加密是一个我几乎没有任何经验的话题,直到我明年在大学真正了解它(不包括简单密码的基本知识)。我希望将来能更好地理解它们,但现在我只想在不知道内部细节的情况下将它们实现到我的应用程序中。

设想

我正在尝试通过向其中添加加密来保护我的 PHP/NodeJS 应用程序之一。我这样做是为了以安全的方式在 NodeJS 和 PHP 之间共享数据。

PHP 服务器 -> 需要能够加密和解密数据

NodeJS 服务器 -> 只需要能够解密数据

可能的解决方案

我花了几个小时寻找一个体面的解决方案来解决我的问题。我尝试了许多代码示例,但这似乎是迄今为止我遇到并测试过的最好的代码示例。

从代码中可以看出,已经为 NodeJs 和 PHP 构建了解密方法。到目前为止,与我测试的结果相比,两者似乎都运行良好。我的问题已经解决了一半。:-)

我现在要做的是弄清楚我们如何使用 PHP 代码实现加密功能。我试过这个:

print "Encrypted: " . base64_encode(openssl_encrypt("Hello world", 'aes-256-cbc', $password));

但我得到的输出是:aUZaNnFlWWV5M0dObTE1U3pxMENwdz09当我实际上应该得到 edata 的值作为输出时:U2FsdGVkX18M7K+pELP06c4d5gz7kLM1CcqJBbubW/Q=

有谁知道为什么这个输出不同?我显然做错了什么,但我只是无法弄清楚我应该做什么,因为该 PHP 代码中发生了很多事情......如果有人能给我一些指导,那就太好了。谢谢!

4

1 回答 1

0

但我得到的输出是:aUZaNnFlWWV5M0dObTE1U3pxMENwdz09当我实际上应该得到 edata 的值作为输出时:U2FsdGVkX18M7K+pELP06c4d5gz7kLM1CcqJBbubW/Q=

有两件事要记住:

  1. 除非您指定OPENSSL_RAW_DATA,openssl_encrypt()将自动为您对输出进行 base64 编码,因此第二个输出是双重编码的。
  2. 您在上面链接的 Node.js 代码片段做了一些有趣的事情来生成密钥和 IV,而您的 PHP 代码片段根本不这样做。

    var rounds = 3;
    var data00 = password + salt;
    
    console.log("Data00 (Base64): " + new Buffer(data00, "binary").toString("base64"));
    
    md5_hash = new Array();
    md5_hash[0] = crypto.createHash("md5").update(data00).digest("binary");
    
    var result = md5_hash[0];
    console.log("MD5-Hash[0] (Base64): " + new Buffer(result, "binary").toString("base64"));
    
    for (i = 1; i < rounds; i++) {
        md5_hash[i] = crypto.createHash("md5").update(md5_hash[i - 1] + data00).digest("binary");
        result += md5_hash[i];
        console.log("Result (Base64): " + new Buffer(result, "binary").toString("base64"));
    }
    

    相反,您的 PHP 代码段使用裸$password变量并且根本不传递 IV,这会产生错误:

    php > $password = 'password';
    php > echo base64_encode(openssl_encrypt("Hello world", 'aes-256-cbc', $password));
    PHP Warning:  openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in php shell code on line 1
    NlpwenNFNCtJYjhjOWNIYkNHazZCZz09
    

所以这些是你失败的直接根源:

  • 你的钥匙不一样。
  • Node.js 片段使用 IV,而您没有。你需要一个用于 AES-CBC 的 IV。

而且:AES-CBC本身并不安全请参阅此答案以了解该怎么做。

于 2018-11-01T22:20:37.673 回答