Bagaimana saya bisa mendapatkan shaX yang di-encode base64 pada cli?

32

sha1summenghasilkan format hex yang dikodekan dari sha yang sebenarnya. Saya ingin melihat varian encoding base64. mungkin beberapa perintah yang menampilkan versi biner yang dapat saya pipirkan, seperti: echo -n "message" | <some command> | base64atau jika ia mengeluarkannya secara langsung juga tidak masalah.

xenoterracide
sumber

Jawaban:

41

Jika Anda memiliki utilitas baris perintah dari OpenSSL , ia dapat menghasilkan intisari dalam bentuk biner, dan bahkan dapat menerjemahkan ke base64 (dalam permintaan terpisah).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
echo foo | openssl dgst -binary -sha1 | base64adalah setara, dan mungkin cara terbersih untuk melakukan ini.
xenoterracide
3
Menggunakan openssluntuk base64 juga memiliki keuntungan tergantung hanya pada satu alat ( ksh: base64: not found).
Gilles 'SANGAT berhenti menjadi jahat'
2
Untuk hash intisari pesan yang besar sha512, Anda mungkin ingin menambahkan -Aopsi ke openssl base64perintah akhir , untuk mencegah pemisahan string yang dihasilkan menjadi beberapa baris.
mykhal
@Gilles Mengapa echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64menghasilkan string yang berbeda?
georgeliatsos
@ gliatsos Karena echo -n foodan echo foomenghasilkan string yang berbeda.
Gilles 'SANGAT berhenti menjadi jahat'
16

Karena sha1sumtidak memberikan opsi untuk keluaran biner, Anda mungkin perlu menemukan utilitas yang melakukan kebalikan oddan menyalurkannya. Mengambil saran dari fschmitt untuk digunakan xxddengan flag 'reverse' dan 'dump polos' akan terlihat seperti ini:

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

alex
sumber
4
Gunakan xxd dengan flag -rp. Seperti ini: sha1sum somefile.txt | cut -f1 -d \ | xxd -r -p | base64
fschmitt
@ fschmitt: Seharusnya saya membaca komentar ini sebelum memposting jawaban saya, jauh lebih bersih. Anda harus mempertimbangkan mempostingnya sebagai jawaban. Saya akan memilih itu.
Steven D
Ini jawaban yang lebih alex, saya hanya googled "convert hex binary unix", jadi alex, jangan ragu untuk mengedit jawaban Anda untuk memasukkan panggilan xxd dan kami akan memilih ini.
fschmitt
Mengedit jawaban saya. Terima kasih telah menunjukkan xxd:)
alex
luar biasa! Ini sulit diketahui dari dokumentasi httpd.apache.org/docs/2.4/misc/password_encryptions.html yang tidak menyebutkan perlunya langkah ini
phil294
1

Saya tidak sepenuhnya yakin saya mengerti apa yang Anda inginkan, tetapi saya pikir sesuatu seperti berikut ini akan berfungsi:

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

Pada dasarnya, saya mengambil output hex, gunakan seduntuk membuatnya menjadi string nilai-nilai hex yang lolos, dan kemudian gunakan echo -enuntuk menggemakan byte menjadi base64.

Kami dapat mengkonfirmasi bahwa hasil akhir sesuai dengan hash yang sama dengan latihan berikut:

$ 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                                .&.}

Inspeksi visual menunjukkan bahwa nilai base64 kami cocok dengan hex asli. Perhatikan bahwa jika Anda menggunakan hexdumpdaripada xxdmungkin Anda harus bermain dengan pengaturan format sedikit untuk mendapatkan output yang Anda harapkan.

Steven D
sumber
1

Perl memiliki modul base64 (dalam distribusi dasar sejak 5.7.1).

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

Jika Anda memiliki Digest::SHAmodul (dalam distribusi dasar sejak 5.9.3), atau Digest::SHA1modul yang lebih lama , Anda dapat melakukan seluruh perhitungan dalam perl. Pada perl 5.10.1, b64digesttidak mendukung output base64; Jika Anda perlu melapisi, cara termudah adalah menggunakan 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)'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
baik jika kita menggunakan perl, kita bisa menggunakan modul Digest :: SHA yang akan memungkinkan kita untuk output langsung ke base64.
xenoterracide
0

Base64 mengkodekan hash SHA256 menjadi checksum file yang agak standar di OpenBSD baru-baru ini .. Ini dapat dilakukan hanya dengan menambahkan -bopsi ke perintah OpenBSD sha256(atau sha1, sha512):

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

atau:

$ cksum -q -a sha256b $FILE
mykhal
sumber