Як я можу отримати shaX з кодованим base64 на кліпі?


32

sha1sumвиводить шістнадцятковий кодований формат фактичного ша. Я хотів би бачити варіант, закодований base64. можливо, якась команда, яка виводить бінарну версію, яку я можу передавати, як-от так: echo -n "message" | <some command> | base64або якщо вона виводить її безпосередньо, це теж добре.

Відповіді:


41

Якщо у вас є утиліта командного рядка від OpenSSL , вона може виробляти дайджест у двійковій формі, і він може навіть переводити на base64 (в окремому виклику).

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

1
echo foo | openssl dgst -binary -sha1 | base64рівнозначний, і, мабуть, найчистіший спосіб зробити це.
ксенотеррацид

3
Використання opensslдля base64 також має перевагу в залежності від лише одного інструмента ( ksh: base64: not found).
Жил "ТАК - перестань бути злим"

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створюються різні рядки.
Жил 'SO- перестань бути злим'

16

Оскільки 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: Я повинен був прочитати цей коментар, перш ніж публікувати свою відповідь, він набагато чистіший. Ви повинні розглянути публікацію як відповідь. Я б проголосував за це.
Стівен Д

Це більше відповідь Алекса, я просто гугл "конвертувати шістнадцятковий бінарний unix", тому Алекс, сміливо редагуйте свою відповідь, щоб включити виклик 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щоб зробити його рядком уникнутих шестигранних значень, а потім використовую, echo -enщоб повторити байти в base64.

Ми можемо підтвердити, що підсумковий результат відповідає тому ж хешу наступною вправою:

$ 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не вкладається вихідний результат64; якщо вам потрібна прокладка, найпростішим способом є використання 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, який би дозволив нам виводити безпосередньо на base64.
ксенотеррацид

0

Нещодавно кодований хеш SHA256, кодований Base64, став досить стандартною контрольною сумою файлів у OpenBSD . Це можна зробити, лише додавши -bпараметр до команди OpenBSD sha256(або sha1, sha512):

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

або:

$ cksum -q -a sha256b $FILE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.