加密是一个我从未体验过的主题,直到我明年在大学里学到它(不包括简单加密的基本知识)。我希望将来能更好地理解它们,但是现在我只想在不了解内部细节的情况下将它们应用到我的应用程序中。
方案
我正在尝试通过添加加密来保护我的一个PHP / NodeJS应用程序。我这样做是为了能够以安全的方式在NodeJS和PHP之间共享数据。
PHP服务器 - >需要能够加密和解密数据
NodeJS服务器 - >只需要能够解密数据
可能的解决方案
我花了几个小时寻找解决问题的方法。我已经尝试了很多代码示例,但到目前为止,我已经遇到过this seems to be the best代码示例。
从代码中可以看出,已经为NodeJ和PHP构建了解密方法。从我测试的内容来看,两者似乎都运行良好。我的问题的一半已经解决了。 : - )
我现在要做的是如何使用PHP代码实现加密功能。我试过这个:
print "Encrypted: " . base64_encode(openssl_encrypt("Hello world", 'aes-256-cbc', $password));
但是我得到了aUZaNnFlWWV5M0dObTE1U3pxMENwdz09
的输出,实际上我应该将edata的值作为输出:U2FsdGVkX18M7K+pELP06c4d5gz7kLM1CcqJBbubW/Q=
有谁知道为什么这个输出有所不同?我显然做错了什么,但我无法弄清楚我应该做什么,因为PHP代码中有太多的东西......如果有人能给我一点指导,那就太好了。谢谢!
答案 0 :(得分:0)
但是当我实际上应该获取edata的值作为输出时,我得到了
aUZaNnFlWWV5M0dObTE1U3pxMENwdz09
的输出:U2FsdGVkX18M7K+pELP06c4d5gz7kLM1CcqJBbubW/Q=
有两件事要记住:
OPENSSL_RAW_DATA
,否则openssl_encrypt()
将为您自动对输出进行base64编码,因此第二个输出将被双重编码。您在上面链接的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
因此,这些是您失败的直接原因:
但也: AES-CBC is not secure本身。请参见this answer。