Como posso obter um shaX codificado em base64 no cli?

27

sha1sum gera um formato codificado hexadecimal do sha atual. Eu gostaria de ver uma variante codificada em base64. possivelmente algum comando que produza a versão binária que eu posso canalizar, da seguinte forma: echo -n "message" | <some command> | base64 ou se a saída for diretamente, tudo bem também.

    
por xenoterracide 01.11.2010 / 10:18

5 respostas

32

Se você tem o utilitário de linha de comando do OpenSSL , ele pode produzir um resumo em formato binário e pode até mesmo traduzir para base64 (em uma invocação separada).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
    
por 02.11.2010 / 19:51
13

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

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

    
por 01.11.2010 / 11:21
1

Não tenho certeza se entendi o que você quer, mas acho que algo como o seguinte deve funcionar:

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

Basicamente, eu pego a saída hexadecimal, uso sed para torná-la uma string de valores hexadecimais com escape e, em seguida, uso echo -en para representar 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/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 de base64 corresponde ao hexadecimal original. Observe que, se você usar hexdump em vez de xxd , talvez tenha que jogar com as configurações de formato um pouco para obter a saída esperada.

    
por 01.11.2010 / 18:00
1

Perl tem um módulo base64 (na distribuição básica desde 5.7.1).

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

Se você tiver o módulo Digest::SHA (na distribuição base desde 5.9.3), ou o módulo Digest::SHA1 mais antigo, você pode fazer o cálculo inteiro em perl. A partir do 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)'
    
por 01.11.2010 / 19:52
0

O hash SHA256 codificado em Base64 tornou-se uma soma de verificação de arquivos padrão no OpenBSD recentemente. Isso pode ser feito apenas adicionando a opção -b ao comando sha256 (ou sha1, sha512) do OpenBSD:

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

ou:

$ cksum -q -a sha256b $FILE
    
por 18.08.2015 / 16:40