我正在尝试从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计算出的哈希值的前映像。 echo -n "hash_value" | openssl sha1

任何帮助将非常感激 :)

#1楼 票数:2 已采纳

TL; DR :使用/bin/echo

说明

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

echo "-n abc" | openssl sha1
9d4fe92b8bdc894f5838fad83108bf3841b257fa

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

  ask by alwaysSpaegie translate from so

未解决问题?本站智能推荐:

2回复

sha1与go在python和openssl中的区别

我试图在go中构建一个base64编码的sha1哈希,但我得到的结果与其他编程语言的结果非常不同 此Go Code打印出aGVsbG/aOaPuXmtLDTJVv++VYBiQr9gHCQ== 我的Python代码看起来像这样 并输出qvTGHdzF6KLavt4PO0gs2a6pQ
1回复

为什么OpenSSL在我的终端中返回不同的SHA1哈希输出?

我正在尝试使用SHA1哈希一个相当小的值来进行大学运动。 我正在运行OpenSSL 1.1.1 2018年9月11日。操作系统是Ubuntu 18.04.1,通过适用于Linux 1的Windows子系统运行。 运行以下任何一项; echo "361448504617" | openss
1回复

C++OPENSSL中的SHA1错误

有人能告诉我我做错了什么吗? 我正在尝试为“12345”打印 SHA1 哈希,但显示错误,我无法弄清楚代码中的问题是什么 我得到的哈希: 正确的哈希:
2回复

SHA1面向比特的测试向量在openssl下给出了错误的摘要

因此,我遍历了此测试向量列表,以测试SHA1实现的有效性(您可以在http://csrc.nist.gov/groups/STM/cavp/secure-hashing.html的底部找到) 多数测试向量称为“短”(因为它们的大小小于块大小)可以通过。 但是,对于所有长测试向量,opens
1回复

openssl,签署(SHA1)消息并进行短信

我是openssl和所有这些加密材料的新手,需要一点帮助。 我需要签名一条消息(摘要sha1)并将其放在mime部分中。 a)进行摘要并签名: b)我得到了mime和签名(但整个消息而不是摘要): 因此,a)给了我摘要和签名,但并非全部作为MIME的最终结果 和 b)给了
1回复

使用OpenSSL将SHA1证书转换为MD5

我正在尝试将服务器从http转换为https,并且由于密钥库中存在有问题的证书而遇到麻烦: 我的最终目标是自动化一个过程,以编程方式遍历密钥库中的这些证书,并将它们转换为其他格式(即MD5)。 有没有可以简单转换SHA1-> MD5的命令? 那有可能吗? 有没有比通过OpenS
2回复

system.security.cryptography.sha1是否使用OpenSSL库的SHA1算法实现?

还是由Microsoft实现的自定义算法? 我测试了在Mac上使用OpenSSL计算的SHA1等效于使用system.security.cryptography.sha1在C#中计算的哈希。
3回复

C中的SHA1错误实现

我一直在努力让sha1()函数从openssl / sha.h运行,但是我得到随机输出和一些警告。 我已经阅读了很多,并尝试了一些示例代码,但我得到了所有的警告,但它没有正确显示。 这是代码: 以下是我收到的警告: 当我运行它并得到输出:62652b34 任何帮助都会很棒!