ฉันจะได้รับ base64 ที่เข้ารหัส shaX บน cli ได้อย่างไร?


31

sha1sumเอาต์พุตรูปแบบที่เข้ารหัส hex ของ sha จริง ฉันอยากจะเห็นตัวแปรที่เข้ารหัส base64 อาจมีคำสั่งบางอย่างที่ส่งออกเวอร์ชันไบนารีที่ฉันสามารถไพพ์ได้เช่น: echo -n "message" | <some command> | base64หรือถ้ามันส่งออกโดยตรงนั้นก็ใช้ได้เช่นกัน

คำตอบ:


40

หากคุณมียูทิลิตีบรรทัดคำสั่งจากOpenSSLสามารถสร้างไดรฟ์ย่อยในรูปแบบไบนารีและยังสามารถแปลเป็น base64 (ในการร้องขอแยกต่างหาก)

echo -n foo | openssl dgst -binary -sha1 | openssl base64

1
echo foo | openssl dgst -binary -sha1 | base64เทียบเท่าและอาจเป็นวิธีที่สะอาดที่สุดในการทำเช่นนี้
xenoterracide

3
การใช้opensslสำหรับ base64 รวมถึงข้อดีของการใช้เครื่องมือเพียงตัวเดียว ( ksh: base64: not found)
Gilles 'หยุดความชั่วร้าย'

2
สำหรับแฮชย่อยข้อความขนาดใหญ่เช่นsha512คุณอาจต้องการเพิ่ม-Aตัวเลือกในopenssl base64คำสั่งสุดท้ายเพื่อป้องกันการแยกสตริงผลลัพธ์ออกเป็นหลายบรรทัด
mykhal

@Gilles ทำไมต้องecho foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64สร้างสตริงที่แตกต่างกันอย่างไร
georgeliatsos

@gliatsos เพราะecho -n fooและecho fooสร้างสตริงที่แตกต่างกัน
Gilles 'หยุดชั่วร้าย'

15

เนื่องจากsha1sumไม่มีตัวเลือกสำหรับเอาต์พุตไบนารีคุณอาจต้องหายูทิลิตีซึ่งทำหน้าที่ตรงกันข้ามกับodไปป์นั้น การแนะนำโดย fschmitt เพื่อใช้xxdกับธง 'reverse' และ 'plain dump' มันจะมีลักษณะเช่นนี้:

sha1sum | cut -f1 -d\ | xxd -r -p | base64


4
ใช้ xxd พร้อมกับแฟล็ก -rp เช่นนี้: sha1sum somefile.txt | ตัด -f1 -d \ | xxd -r -p | base64
fschmitt

@fschmitt: ฉันควรอ่านความคิดเห็นนี้ก่อนโพสต์คำตอบของฉันมันสะอาดกว่ามาก คุณควรพิจารณาโพสต์มันเป็นคำตอบ ฉันจะลงคะแนนให้
Steven D

มันเป็นคำตอบที่มากกว่า alex ฉันเพิ่ง googled "แปลงเลขฐานสองฐานสิบหก unix" ดังนั้น alex โปรดแก้ไขคำตอบของคุณเพื่อรวมการเรียก xxd แล้วเราจะลงคะแนนนี้
fschmitt

แก้ไขคำตอบของฉัน ขอบคุณที่ชี้นำxxd:)
alex

! น่ากลัว นี่เป็นเรื่องยากที่จะเข้าใจจากเอกสารhttpd.apache.org/docs/2.4/misc/password_encryptions.htmlซึ่งไม่ได้พูดถึงความจำเป็นของขั้นตอนนี้
phil294

1

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณต้องการอย่างสมบูรณ์ แต่ฉันคิดว่าสิ่งต่อไปนี้ควรใช้งานได้:

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64

โดยทั่วไปผมจะใช้การส่งออกฐานสิบหกใช้sedจะทำให้มันเป็นสตริงของค่า hex หนีแล้วใช้สะท้อนไบต์ลงecho -enbase64

เราสามารถยืนยันได้ว่าผลลัพธ์สุดท้ายนั้นสอดคล้องกับแฮชเดียวกันกับแบบฝึกหัดต่อไปนี้:

$ echo -n "message" | sha1sum 
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d  -

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
b5ua881ui4pzws3O03/p9ZIm4n0=

$ echo -n "b5ua881ui4pzws3O03/p9ZIm4n0=" | base64 -d | xxd
0000000: 6f9b 9af3 cd6e 8b8a 73c2 cdce d37f e9f5  o....n..s.......
0000010: 9226 e27d                                .&.}

การตรวจสอบด้วยภาพแสดงให้เห็นว่าค่าฐาน 64 ของเราตรงกับฐานสิบหกเดิม โปรดทราบว่าหากคุณใช้งานhexdumpมากกว่าที่xxdคุณจะต้องเล่นด้วยการตั้งค่ารูปแบบเล็กน้อยเพื่อให้ได้ผลลัพธ์ที่คุณคาดหวัง


1

Perl มีโมดูล base64 (ในการกระจายฐานตั้งแต่ 5.7.1)

echo foo | sha1sum | \
perl -MMIME::Base64 -ne '/^([[:xdigit:]]+)/ and print encode_base64(pack("H*",$1))'

หากคุณมีDigest::SHAโมดูล (ในการแจกแจงฐานตั้งแต่ 5.9.3) หรือDigest::SHA1โมดูลเก่าคุณสามารถทำการคำนวณทั้งหมดใน Perl ในฐานะของ perl 5.10.1 b64digestไม่ได้บีบเอาท์พุท base64 หากคุณต้องการ padding MIME::Base64วิธีที่ง่ายที่สุดคือการใช้งาน

perl -MDigest::SHA -e 'print Digest::SHA->new(1)->addfile(*STDIN)->b64digest'
perl -MMIME::Base64 -MDigest::SHA \
     -le 'print encode_base64(Digest::SHA->new(1)->addfile(*STDIN)->digest)'

ถ้าเราใช้ Perl เราสามารถใช้ Digest :: SHA module ซึ่งจะทำให้เราสามารถส่งออกไปยัง base64 ได้โดยตรง
xenoterracide

0

Base64 ที่เข้ารหัส SHA256 แฮชค่อนข้างเช็กซัมไฟล์มาตรฐานในOpenBSDเมื่อเร็ว ๆ นี้สามารถทำได้เพียงแค่เพิ่ม-bตัวเลือกในsha256คำสั่งของ OpenBSD (หรือ sha1, sha512):

$ FILE=/dev/null
$ sha256 -q -b $FILE
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

หรือ:

$ cksum -q -a sha256b $FILE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.