我遇到过类似问题的其他主题,但由于最近PHP的变化(即 mcrypt 删除),我正在寻求一些关于我如何最好的建议这在2017/18使用OpenSSL。
在Mac终端中使用echo 'this string will be encrypted' | openssl enc -aes-256-cbc -a -pass pass:123
,我能够对字符串进行密码加密,现在想将此(作为参数)传递到服务器端PHP函数中进行解密。
在研究过this问题之后,我可以看到它有可能但是它使用了现在删除的 mcrypt 函数。进一步阅读PHP manual,我更接近于弄清楚如何将此加密命令转换为其PHP解密等价物。
This recent answer是我到目前为止所实现的,再次,它只是不适用于终端生成的加密,只有一个是用PHP创建的(这里没有显示)。
<?php
$encrypted_string = $_GET['data'];
$password = '123';
$decrypted_data = openssl_decrypt($encrypted_string, "AES-256-CBC", $password);
print "Decrypted Data: <$decrypted_data>\n";
?>
OpenSSL PHP手册指出可以传入纯文本或base64编码的字符串并对其进行解密。由于我在加密期间使用了-a
标志,因此我希望传入base64,从而消除源作为未返回解密数据的潜在原因。
我已经处理了URL编码,使得加密算法生成的任何+符号都被替换为 - %2B - URL-Safe等价物,因为它们会被转换为空格字符,从而打破了参数字符串。这进一步确保了解密算法正确地解码了编码的输入字符串。
问题:为什么我的PHP函数不会解密terminal命令生成的字符串,尽管两者都使用相同的方法和密码?我的PHP代码中缺少什么才能使其正常工作?
为每个人欢呼。
更新
我现在正在使用终端命令:
echo 'blah' | openssl enc -aes-256-cbc -a -K B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF -iv 64299685b2cc8da5
加密到:Y4xelTtEJPUHytB5ARwUHQ==
我使用www.example.com/?data=Y4xelTtEJPUHytB5ARwUHQ==
PHP应该采用数据参数并解密。目前,该功能如下所示:
<?php
$encrypted_string = base64_decode($_GET['data']);
$key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF';
$iv = '64299685b2cc8da5';
$output = openssl_decrypt($encrypted_string, 'AES-256-CBC', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv));
print "Decrypted Data: <$output>\n";
?>
答案 0 :(得分:1)
OpenSSL使用您可能不想在PHP代码中重现的专有KDF。但是,您可以使用-K
标志将密钥作为纯十六进制传递,避免使用KDF:
echo 'blah' | openssl enc -aes-256-cbc -K 0000000000000000000000000000000000000000000000000000000000000000
这里,大十六进制字符串是您的256位密钥,十六进制编码。此加密操作将与您的PHP兼容。