Как я могу получить shaX в кодировке base64?

32

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

xenoterracide
источник

Ответы:

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команде, чтобы предотвратить разбиение полученной строки на несколько строк.
Михал
@ Жиль Почему echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64получается другая строка?
Георгиелиотс
@gliatsos Потому echo -n fooи echo fooпроизводят разные строки.
Жиль "ТАК - перестать быть злым"
16

Так sha1sumкак не предоставляет опцию для двоичного вывода, вам, вероятно, потребуется найти утилиту, которая делает противоположное, odи направить их. Принимая предложение от fschmitt использовать xxdфлаги 'reverse' и 'plain dump', это будет выглядеть так:

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

Алекс
источник
4
Используйте xxd с флагом -rp. Как это: sha1sum somefile.txt | cut -f1 -d \ | xxd -r -p | base64
fschmitt
@fschmitt: я должен был прочитать этот комментарий, прежде чем публиковать свой ответ, он намного чище. Вы должны рассмотреть возможность размещения его в качестве ответа. Я бы проголосовал за это.
Стивен Д
Это скорее ответ от alex, я только что гуглил "преобразовать шестнадцатеричный бинарный 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для создания строки экранированных шестнадцатеричных значений, а затем использую 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                                .&.}

Визуальный осмотр показывает, что наше значение base64 соответствует исходному гексу. Обратите внимание, что если вы используете, 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; если вам нужно заполнить, проще всего использовать 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
mykhal
источник