Jak mogę uzyskać shaX zakodowane w base64 na CLI?


32

sha1sumwyprowadza w formacie heksadecymalnym rzeczywisty sha. Chciałbym zobaczyć wariant zakodowany w standardzie base64. być może jakieś polecenie, które wypisuje wersję binarną, którą mogę potokować, na przykład: echo -n "message" | <some command> | base64lub jeśli wypisuje ją bezpośrednio, to też jest w porządku.

Odpowiedzi:


41

Jeśli masz narzędzie wiersza polecenia z OpenSSL , może wygenerować skrót w formie binarnej, a nawet może przetłumaczyć na base64 (w osobnym wywołaniu).

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

1
echo foo | openssl dgst -binary -sha1 | base64jest równoważny i prawdopodobnie najczystszy sposób na zrobienie tego.
Xenoterracide

3
Korzystanie opensslz base64 również ma tę zaletę, że polega tylko na jednym narzędziu ( ksh: base64: not found).
Gilles „SO- przestań być zły”

2
W przypadku skrótów z dużymi skrótami wiadomości sha512, możesz chcieć dodać -Aopcję do ostatecznego openssl base64polecenia, aby zapobiec podzieleniu wynikowego łańcucha na wiele wierszy.
mykhal

@Gilles Dlaczego echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64produkuje inny ciąg?
georgeliatsos,

@gliatsos Ponieważ echo -n fooi echo fooprodukują różne ciągi.
Gilles 'SO - przestań być zły'

16

Ponieważ sha1sumnie zapewnia opcji wyjścia binarnego, prawdopodobnie będziesz musiał znaleźć narzędzie, które robi coś przeciwnego odi potokuje je. Przyjmując sugestię fschmitt do użycia xxdz flagami „reverse” i „plain dump” będzie to wyglądać następująco:

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


4
Użyj xxd z flagą -rp. W ten sposób: sha1sum somefile.txt | Wytnij -f1 -d \ | xxd -r -p | base64
fschmitt

@fschmitt: Powinienem przeczytać ten komentarz przed opublikowaniem mojej odpowiedzi, jest o wiele czystszy. Powinieneś rozważyć opublikowanie go jako odpowiedzi. Głosowałbym na to.
Steven D

To więcej odpowiedzi na Alexa, po prostu przejrzałem „Convert hex binary unix”, więc alex, możesz edytować swoją odpowiedź, aby uwzględnić wywołanie xxd, a my to głosujemy.
fschmitt

Edytowałem moją odpowiedź. Dzięki za wskazanie xxd:)
Alex

niesamowite! Trudno było to ustalić na podstawie dokumentacji httpd.apache.org/docs/2.4/misc/password_encryptions.html, które nie wspominają o konieczności tego kroku
phil294

1

Nie jestem do końca pewien, czy rozumiem, czego chcesz, ale myślę, że powinno działać coś takiego:

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

Zasadniczo pobieram dane wyjściowe w postaci szesnastkowej, używam, sedaby zrobić z nich ciąg ucieczkowych wartości szesnastkowych, a następnie używam echo -endo echa bajtów base64.

Możemy potwierdzić, że wynik końcowy odpowiada temu samemu hashowi, wykonując następujące ćwiczenie:

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

Kontrola wzrokowa wykazuje, że nasza wartość base64 odpowiada oryginalnemu heksowi. Pamiętaj, że jeśli używasz hexdumpzamiast xxdbyć może będziesz musiał nieco pograć z ustawieniami formatu, aby uzyskać oczekiwany wynik.


1

Perl ma moduł base64 (w podstawowej dystrybucji od 5.7.1).

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

Jeśli masz Digest::SHAmoduł (w podstawowej dystrybucji od 5.9.3) lub starszy Digest::SHA1moduł, możesz wykonać całe obliczenia w perlu. Począwszy od wersji 5.10.1, b64digestnie wypełnia wyjścia base64; jeśli potrzebujesz wypełnienia, najłatwiejszym sposobem jest użycie 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)'

cóż, jeśli używamy perla, moglibyśmy po prostu użyć modułu Digest :: SHA, który pozwoliłby nam na wyjście bezpośrednio do base64.
Xenoterracide

0

Skrót SHA256 zakodowany w standardzie Base64 stał się ostatnio raczej standardową sumą kontrolną pliku w OpenBSD . Można to zrobić po prostu dodając -bopcję do polecenia OpenBSD sha256(lub sha1, sha512):

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

lub:

$ cksum -q -a sha256b $FILE
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.