如何通过命令行让openssl像php一样加密密码

如何通过命令行让openssl像php一样加密密码

我有这个 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 使用ivkey变量作为字符串,opensslCLI 需要十六进制版本的字符串,没有空格和换行符,正如我将展示的那样。

首先,我需要使用以下方法将 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大写字母,否则生成的字符串不相同。

相关内容