![如何通过命令行让openssl像php一样加密密码](https://linux22.com/image/90783/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%AE%A9openssl%E5%83%8Fphp%E4%B8%80%E6%A0%B7%E5%8A%A0%E5%AF%86%E5%AF%86%E7%A0%81.png)
我有这个 php 脚本(encrypt.php)
<?php
function encrypt($pure_string, $encryption_key, $encryptionMethod = "AES-256-CBC")
{
$iv = "3571984260";
$encrypted_string = openssl_encrypt($pure_string, $encryptionMethod, $encryption_key, false, $iv);
return $encrypted_string;
}
echo encrypt ("$argv[1]", 'mysecret');
?>
它有效,但我试图通过 openssl cli 达到相同的结果(我需要它)。
但是这个:
echo '12345' | openssl enc -aes-256-cbc -iv "3571984260" -k mysecret -a
不会产生与以下相同的结果:
php encrypt.php 12345
实际上,shell 版本正在更改每次执行生成的字符串,而 php 版本始终生成相同的字符串。我需要使用 openssl cli 获得与 php 脚本相同的结果。
我究竟做错了什么?
答案1
我发现了!
php 使用iv
和key
变量作为字符串,openssl
CLI 需要十六进制版本的字符串,没有空格和换行符,正如我将展示的那样。
首先,我需要使用以下方法将 iv 和 pass 字符串转换为十六进制:
确定 IV 十六进制等效值:
hexiv=$(echo $(echo -n '3571984260' | od -A n -t x1) | tr -d " ")
确定mysecret
十六进制等效值:
hexpass=$(echo $(echo -n 'mysecret' | od -A n -t x1) | tr -d " ")
现在还有一件事,php 的通行证不是 openssl cli 的通行证,而是 KEY:
echo -n '12345' | openssl enc -aes-256-cbc -iv "$hexiv" -K "$hexpass" -a
现在它的工作方式与 php 脚本完全一样!
重要提示:我需要使用-K
大写字母,否则生成的字符串不相同。