openssl sha1在终端与Python中提供不同的结果

时间:2018-10-12 15:20:45

标签: python openssl sha1

我试图从Python脚本运行openssl命令,但是从脚本中执行的命令和直接在终端中执行的命令获取不同的sha1值。

这是我的代码:

command = "echo -n '" + hex(key)[2:] + "' | openssl sha1"
print(command)
os.system(command)
output = subprocess.check_output(command, shell=True)
# This converts the bytes object to a string.
output = output.decode("utf-8")
print(output)

os.system(command)仅用于检查此方法和subprocess.check_output()是否给出相同的结果。

以下是key=0xabc的示例输入的程序输出:

echo -n 'abc' | openssl sha1
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa

第一行是要执行的命令,第二行是使用os.system()的命令的结果,第三行是使用subprocess.check_output()的命令的结果。如您所见,这两种方法给出的结果相同。

现在,如果我复制并粘贴此处显示的命令并在终端中执行该命令,则结果如下:

(stdin)= a9993e364706816aba3e25717850c26c9cd0d89d

即使我复制并粘贴了完全相同的命令,但哈希值输出还是不同的。

即使是陌生人,如果我从-n中省略了echo选项,也不会出现不一致的情况:

echo 'abc' | openssl sha1
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451

在终端机中:

(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451

我在网上阅读的所有有关类似问题的信息都源于未使用-n,而不是看似引起问题的-n。对于我正在执行的特定任务,我必须使用-n,因为我正在计算使用echo -n "hash_value" | openssl sha1计算的哈希值的前映像。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:2)

TL; DR :使用/bin/echo

说明

python系统命令可能使用/bin/sh的默认外壳程序,该外壳程序通常链接到POSIX兼容外壳程序,而终端会话使用的是用户的登录外壳程序,很可能是bash。 POSIX Shell标准不支持内置功能-n的{​​{1}}选项。这意味着您实际上是在计算“ -n abc”的摘要。您可以像这样重现bash:

echo

二进制可执行文件仍然可用,但是需要使用完整路径来调用,因为内置的Shell会覆盖它。代替echo "-n abc" | openssl sha1 9d4fe92b8bdc894f5838fad83108bf3841b257fa ,使用echo