Comment puis-je obtenir un shaX encodé en base64 sur le cli?

32

sha1sumaffiche un format hexadécimal du sha réel. Je voudrais voir une variante encodée en base64. éventuellement une commande qui sort la version binaire que je peux diriger, comme ceci: echo -n "message" | <some command> | base64ou si elle le sort directement c'est bien aussi.

xénoterracide
la source

Réponses:

41

Si vous disposez de l'utilitaire de ligne de commande d' OpenSSL , il peut produire un résumé sous forme binaire, et il peut même se traduire en base64 (dans un appel distinct).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
Gilles, arrête de faire le mal
la source
1
echo foo | openssl dgst -binary -sha1 | base64est équivalent, et probablement la façon la plus propre de le faire.
xenoterracide
3
L'utilisation opensslde base64 a également l'avantage de ne dépendre que d'un seul outil ( ksh: base64: not found).
Gilles 'SO- arrête d'être méchant'
2
Pour les hachages de résumé de message volumineux comme sha512, vous souhaiterez peut-être ajouter une -Aoption à la openssl base64commande finale , pour éviter de diviser la chaîne résultante en plusieurs lignes.
mykhal
@Gilles Pourquoi echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64produit une chaîne différente?
georgeliatsos
@gliatsos Parce que echo -n fooet echo fooproduisez des chaînes différentes.
Gilles 'SO- arrête d'être méchant'
16

Puisque sha1sumne fournit pas d'option pour la sortie binaire, vous devrez probablement trouver un utilitaire qui fait le contraire odet les diriger. En prenant la suggestion de fschmitt d'utiliser xxdavec les drapeaux 'reverse' et 'plain dump', cela ressemblera à ceci:

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

alex
la source
4
Utilisez xxd avec l'indicateur -rp. Comme ceci: sha1sum somefile.txt | coupe -f1 -d \ | xxd -r -p | base64
fschmitt
@fschmitt: J'aurais dû lire ce commentaire avant de poster ma réponse, c'est beaucoup plus propre. Vous devriez envisager de le poster comme réponse. Je voterais pour.
Steven D
C'est une réponse plus alex, je viens de googler "convertir hex binaire unix", alors alex, n'hésitez pas à modifier votre réponse pour inclure l'appel xxd et nous voterons cela.
fschmitt
Edité ma réponse. Merci d'avoir souligné xxd:)
alex
impressionnant! C'était difficile à comprendre à partir de la documentation httpd.apache.org/docs/2.4/misc/password_encryptions.html qui ne mentionne pas la nécessité de cette étape
phil294
1

Je ne suis pas complètement 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 hexadécimale, l'utilise sedpour en faire une chaîne de valeurs hexadécimales échappées, puis l'utilise echo -enpour faire écho aux octets 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 base64 correspond à l'hex d'origine. Notez que si vous utilisez hexdumpplutôt que xxdvous devrez peut-être jouer un peu avec les paramètres de format pour obtenir la sortie que vous attendez.

Steven D
la source
1

Perl possède un module base64 (dans la distribution de 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::SHAmodule (dans la distribution de base depuis 5.9.3), ou l'ancien Digest::SHA1module, vous pouvez faire tout le calcul en perl. Depuis perl 5.10.1, b64digestne remplit pas la sortie base64; si vous avez besoin d'un rembourrage, 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)'
Gilles, arrête de faire le mal
la source
eh bien si nous utilisons perl, nous pourrions simplement utiliser le module Digest :: SHA qui nous permettrait de sortir directement en base64.
xénoterracide
0

Le hachage SHA256 encodé en Base64 est récemment devenu une somme de contrôle de fichier plutôt standard dans OpenBSD . Cela peut être fait simplement en ajoutant une -boption à la commande OpenBSD sha256(ou sha1, sha512):

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

ou:

$ cksum -q -a sha256b $FILE
mykhal
la source