簡體   English   中英

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計算出的哈希值的前映像。 echo -n "hash_value" | openssl sha1

任何幫助將非常感激 :)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM