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
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.
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
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
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.
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)'
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
Tags cryptography base64 hashsum