Como posso obter um shaX codificado em base64 no CLI?

32

sha1sumgera um formato codificado hexadecimal do sha real. Gostaria de ver uma variante codificada em base64. possivelmente algum comando que produza a versão binária que eu possa canalizar, assim: echo -n "message" | <some command> | base64ou se a gera diretamente, tudo bem também.

xenoterracida
fonte

Respostas:

41

Se você possui o utilitário de linha de comando do OpenSSL , ele pode produzir um resumo em formato binário e pode até converter para base64 (em uma chamada separada).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
Gilles 'SO- parar de ser mau'
fonte
11
echo foo | openssl dgst -binary -sha1 | base64é equivalente e provavelmente a maneira mais limpa de fazer isso.
Xenoterracide
3
O uso openssldo base64 também tem a vantagem de depender apenas de uma ferramenta ( ksh: base64: not found).
Gilles 'SO- stop be evil'
2
Para hashes de resumo de mensagens grandes como sha512, convém adicionar a -Aopção ao openssl base64comando final , para evitar a divisão da sequência resultante em várias linhas.
mykhal
@Gilles Por que echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64produz uma string diferente?
Georgeliatsos #
@gliatsos Porque echo -n fooe echo fooproduzem diferentes strings.
Gilles 'SO- stop be evil'
16

Como sha1sumnão fornece uma opção para saída binária, você provavelmente precisará encontrar um utilitário que faça o oposto ode encaminhe-os. Tomando a sugestão do fschmitt para usar xxdcom os sinalizadores 'reverse' e 'plain dump', ficará assim:

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

alex
fonte
4
Use xxd com o sinalizador -rp. Assim: sha1sum somefile.txt | corte -f1 -d \ | xxd -r -p | base64
fschmitt
@ fschmitt: Eu deveria ter lido este comentário antes de postar minha resposta, é muito mais limpo. Você deve publicá-lo como resposta. Eu votaria a favor.
Steven D
É mais uma resposta alex, eu apenas pesquisei "converter hex binário unix", então alex, fique à vontade para editar sua resposta para incluir a chamada xxd e votaremos nisso.
Fschmitt 01/11
Editou minha resposta. Obrigado por apontar xxdpara fora :)
alex
impressionante! Isso foi difícil de entender a partir da documentação httpd.apache.org/docs/2.4/misc/password_encryptions.html que não menciona a necessidade dessa etapa
phil294
1

Não tenho certeza absoluta de que entendi o que você deseja, mas acho que algo como o seguinte deve funcionar:

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

Basicamente, eu pego a saída hexadecimal, uso sedpara torná-la uma sequência de valores hexadecimais com escape e, em seguida, uso echo -enpara fazer eco dos bytes base64.

Podemos confirmar que a saída final corresponde ao mesmo hash com o seguinte exercício:

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

A inspeção visual mostra que nosso valor base64 corresponde ao hexadecimal original. Observe que se você usar um hexdumppouco do xxdque talvez precise jogar um pouco com as configurações de formato para obter a saída esperada.

Steven D
fonte
1

O Perl possui um módulo base64 (na distribuição base desde 5.7.1).

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

Se você possui o Digest::SHAmódulo (na distribuição base desde 5.9.3) ou o Digest::SHA1módulo mais antigo , pode fazer todo o cálculo em perl. A partir do perl 5.10.1, b64digestnão preenche a saída base64; se você precisar de preenchimento, a maneira mais fácil é usar 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 'SO- parar de ser mau'
fonte
bem, se estivermos usando perl, poderíamos simplesmente usar o módulo Digest :: SHA, que nos permitiria gerar diretamente para base64.
Xenoterracide
0

O hash SHA256 codificado em Base64 tornou-se um checksum de arquivo padrão no OpenBSD recentemente. Isso pode ser feito apenas com a -bopção de adicionar ao sha256comando do OpenBSD (ou sha1, sha512):

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

ou:

$ cksum -q -a sha256b $FILE
mykhal
fonte