ti-enxame.com

Como posso obter um shaX codificado em base64 no CLI?

sha1sum gera 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 posso canalizar, assim: echo -n "message" | <some command> | base64 ou se ele o exibir diretamente, tudo bem também.

33
xenoterracide

Se você possui o utilitário de linha de comando de 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
43

Desde a sha1sum não fornece uma opção para saída binária, você provavelmente precisará encontrar um utilitário que faça o oposto de od e canalizá-los. Tomando a sugestão de fschmitt para usar xxd com os sinalizadores 'reverse' e 'plain dump', ficará assim:

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

16
alex

Não sei ao certo 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 sed para torná-la uma sequência de valores hexadecimais com escape e, em seguida, uso echo -en para repetir os bytes em 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 hexdump em vez de xxd, poderá ser necessário brincar um pouco com as configurações de formato para obter a saída esperada.

1
Steven D

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ê tiver o Digest::SHA module (na distribuição base desde 5.9.3), ou o mais antigo Digest::SHA1, você pode fazer todo o cálculo no Perl. No Perl 5.10.1, b64digest nã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)'
1

O hash SHA256 codificado em Base64 tornou-se uma soma de verificação de arquivo bastante padrão em OpenBSD recentemente. Isso pode ser feito apenas com a adição de -b opção para o OpenBSD's sha256 (ou sha1, sha512) comando:

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

ou:

$ cksum -q -a sha256b $FILE
0
mykhal