【问题标题】:openssl sha1 giving different results in the terminal vs in Pythonopenssl sha1 在终端与 Python 中给出不同的结果
【发布时间】:2019-03-17 20:46:06
【问题描述】:

我正在尝试从 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 计算的散列的原像。

任何帮助将不胜感激:)

【问题讨论】:

    标签: python openssl sha1


    【解决方案1】:

    TL;DR:使用/bin/echo

    解释

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

    echo "-n abc" | openssl sha1
    9d4fe92b8bdc894f5838fad83108bf3841b257fa
    

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

    【讨论】:

    • 非常感谢!!我为此撕毁了我的头发:)
    • 另一种选择是使用printf,它是可移植的。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2012-10-12
    • 2018-01-03
    • 2021-03-05
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多