“ openssl dgst -sha1” สร้างสิ่งที่ไม่เกี่ยวข้อง“ (stdin) =” คำนำหน้าและขึ้นบรรทัดใหม่


31

หากคุณรันคำสั่งนี้บน Unix ของคุณ

echo -n "foo" | openssl dgst -sha1

คุณจะได้รับผลลัพธ์นี้:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(ตามด้วยการขึ้นบรรทัดใหม่)

ฉันจะบังคับให้ openssl ไม่แสดง(stdin)=คำนำหน้าและหลีกเลี่ยงการขึ้นบรรทัดใหม่ได้อย่างไร


@ MarkDavidson อืมน่าสนใจ คุณแน่ใจหรือว่าไม่ได้ต่อท้ายบรรทัดใหม่

คำตอบ:


22

รูปแบบไบนารีดิบไม่เพิ่มเอาต์พุตภายนอกใด ๆ
เอาต์พุตเป็นไบนารีจากนั้นแปลงเป็น hex:

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

จะให้สิ่งนี้กับคุณ:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

วิธีนี้ควรเป็นหลักฐานในอนาคตในกรณีที่มีคนตัดสินใจเปลี่ยนรูปแบบผลลัพธ์ต้นฉบับเดิมอีกครั้ง ฉันแน่ใจว่าพวกเขาจะแก้ไขคำนำหน้าให้เป็น "SHA1 (stdin) =" เพื่อให้สอดคล้องกับไฟล์อินพุต

ฉันไม่อยากจะเชื่อเลยว่าพวกเขาเปลี่ยนแปลงสิ่งนี้! ฉันสงสัยว่าสคริปต์หลายตัวถูกทำลาย


4
มันจะออก 20-30 octets ต่อบรรทัด (หรือ 40-60 ตัวอักษร) สำหรับการตรวจสอบ SHA-256 บางครั้งไม่เพียงพอ ใช้-c 256ตัวเลือกเพื่อขยายเป็น 256 octets ต่อบรรทัด
Rockallite

16

ฉันสังเกตพฤติกรรมนี้ภายใต้ OpenSSL 1.0.0e บน Ubuntu 11.10 ในขณะที่ผลผลิต OpenSSL 0.9.8k และ 0.9.8t เป็นเพียงแฮช บรรทัดคำสั่งของ OpenSSL ไม่ได้ถูกออกแบบมาให้มีความยืดหยุ่นมันเป็นหนทางที่รวดเร็วและสกปรกในการคำนวณการเข้ารหัสลับจากบรรทัดคำสั่ง

หากคุณต้องการใช้ OpenSSL ให้กรองเอาท์พุท:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

บน Linux (ด้วยเครื่องมือ GNU หรือ BusyBox) คุณสามารถใช้sha1sumซึ่งไม่จำเป็นต้องติดตั้ง OpenSSL และมีรูปแบบเอาต์พุตที่เสถียร มันจะพิมพ์ชื่อไฟล์เสมอดังนั้นตัดออก

echo -n "foo" | sha1sum | sed 's/ .*//'

บนระบบ BSD รวมทั้ง OSX sha1คุณสามารถใช้

echo -n "foo" | sha1 -q

เอาต์พุตทั้งหมดเหล่านี้จะตรวจสอบผลรวมเลขฐานสิบหกตามด้วยขึ้นบรรทัดใหม่ ข้อความภายใต้ระบบยูนิกซ์ประกอบด้วยลำดับบรรทัดเสมอและแต่ละบรรทัดลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ หากคุณเก็บเอาต์พุตของคำสั่งในตัวแปรเชลล์บรรทัดใหม่สุดท้ายจะถูกตัดออก

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

หากคุณต้องการไพพ์อินพุตลงในโปรแกรมที่ต้องการเช็คซัมที่ไม่มีการขึ้นบรรทัดใหม่ขั้นสุดท้าย (ซึ่งหายากมาก) ให้ตัดการขึ้นบรรทัดใหม่

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program

นี่เป็นสถานการณ์ที่สมบูรณ์แบบ => แผนที่โซลูชันคัดลอกและวาง ขอบคุณ!
oberstet

6

นี่คือทางเลือกอื่น:

echo -n "foo" | openssl sha1 | awk '{print $2}'

1
ฉันรู้ว่าคำถามถามด้วยรูปแบบเฉพาะนี้อย่างไรก็ตามหากมีคนพยายามขยายให้รวมชื่อไฟล์มันอาจแตกถ้าชื่อไฟล์มีช่องว่างอยู่ เพียงหัวขึ้นสำหรับคนอื่น ๆ ที่มาถึงที่นี่
Cameron Gagnon

2

นี่คือวิธีการทำโดยใช้ bash ในตัวแทนท่อ awk, sed, tr, cut ฯลฯ

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.