web-dev-qa-db-fra.com

Comment puis-je obtenir une shaxe codée de base64 sur la CLI?

sha1sum génère un format codé hexadécial de la SHA réelle. Je voudrais voir une variante codée de base64. Peut-être une commande qui génère la version binaire que je peux tuyer, comme ça: echo -n "message" | <some command> | base64 ou si cela le génère directement c'est bien aussi.

33
xenoterracide

Si vous avez l'utilitaire de ligne de commande à partir de OpenSSL , il peut produire une digère sous forme binaire et peut même se traduire par la base64 (dans une invocation distincte).

echo -n foo | openssl dgst -binary -sha1 | openssl base64

Depuis sha1sum ne fournit pas d'option pour la sortie binaire, vous aurez probablement besoin de trouver un utilitaire qui fait l'opposé de od et de les pipe. Prise de suggestion de Fschmitt à utiliser xxd avec des drapeaux "inverse" et "Dump", cela ressemblera à ceci:

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

16
alex

Je ne suis pas totalement sûr de comprendre ce que vous voulez, mais je pense que quelque chose comme ce qui suit devrait fonctionner:

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

Fondamentalement, je prends la sortie hexagonale, utilisez sed pour en faire une chaîne de valeurs hexagonales évasées, puis utilisez echo -en Pour écho aux octets dans base64.

Nous pouvons confirmer que la sortie finale correspond au même hachage avec l'exercice suivant:

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

L'inspection visuelle montre que notre valeur de base64 correspond à l'hexagone d'origine. Notez que si vous utilisez hexdump plutôt que xxd, vous devrez peut-être jouer avec les paramètres de format un bit pour obtenir la sortie que vous attendez.

1
Steven D

Perl a un module de base64 (dans la distribution de la base depuis 5.7.1).

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

Si vous avez le Digest::SHA Module (dans la répartition de la base depuis 5.9.3), ou l'ancienne Digest::SHA1 Module, vous pouvez faire tout le calcul en Perl. À partir de Perl 5.10.1, b64digest ne pose pas la sortie de base64; Si vous avez besoin de remplissage, le moyen le plus simple est d'utiliser 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)'

BASE64 codé SHA256 Hash est devenu un jeu de contrôle de fichier plutôt standard dans openbsd récemment .. Il peut être fait juste avec l'ajout -b Option à l'OpenBSD sha256 (ou SHA1, SHA512) commande:

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

ou:

$ cksum -q -a sha256b $FILE
0
mykhal