openssl sha1 在终端与 Python 中给出不同的结果

openssl sha1 giving different results in the terminal vs in Python

我正在尝试从 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

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

更奇怪的是,如果我从echo中省略-n选项,就没有不一致:

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

在终端中:

(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451

我在网上阅读的关于类似问题的所有内容都源于未使用 -n,而不是 -n 似乎导致了问题。对于我正在执行的特定任务,我必须使用 -n 因为我正在计算使用 echo -n "hash_value" | openssl sha1.

计算的哈希的原像

任何帮助将不胜感激:)

TL;DR: 使用/bin/echo

解释:

python 系统命令可能使用 /bin/sh 的默认 shell,它通常链接到 POSIX 兼容的 shell,而您的终端会话正在使用您的用户登录名 shell,这可能是 bash。 POSIX shell 标准不支持 echo 内置函数的 -n 选项。这意味着您实际上是在计算“-n abc”的摘要。您可以像这样重现 bash:

echo "-n abc" | openssl sha1
9d4fe92b8bdc894f5838fad83108bf3841b257fa

二进制可执行文件仍然可用,但需要通过完整路径调用,因为 shell 内置函数会覆盖它。使用 /bin/echo.

而不是 echo