«Openssl dgst -sha1» produisant un préfixe «(stdin) =» superflu et une nouvelle ligne de fin

31

Si vous exécutez cette commande sur votre Unix

echo -n "foo" | openssl dgst -sha1

Vous obtiendrez cette sortie:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(suivi d'une nouvelle ligne).

Comment puis-je forcer openssl à ne pas afficher le (stdin)=préfixe et éviter la nouvelle ligne de fin?

Kevdog777
la source
@MarkDavidson Hmm, intéressant. Êtes-vous sûr qu'il n'ajoute même pas de nouvelle ligne?

Réponses:

22

Le format binaire brut n'ajoute aucune sortie étrangère.
Sortie en binaire puis convertissez en hexadécimal:

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

Vous donnera ceci:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Cette méthode devrait être évolutive au cas où quelqu'un déciderait de modifier à nouveau le format de sortie textuel. Je suis sûr qu'ils fixeront le préfixe pour qu'il soit "SHA1 (stdin) =" pour être cohérent avec celui d'une entrée de fichier.

Je ne peux pas croire qu'ils aient changé ça! Je me demande combien de scripts ont été cassés.

Evil Hacker
la source
4
Il ne produira que 20 à 30 octets par ligne (ou 40 à 60 caractères). Pour la somme de contrôle SHA-256, cela ne suffit pas parfois. Utilisez l' -c 256option pour l'étendre à 256 octets par ligne.
Rockallite
16

J'observe ce comportement sous OpenSSL 1.0.0e sur Ubuntu 11.10, alors que OpenSSL 0.9.8k et 0.9.8t ne produisent que le hachage. La ligne de commande d'OpenSSL n'est pas conçue pour être flexible, c'est plutôt un moyen rapide et sale d'effectuer des calculs cryptographiques à partir de la ligne de commande.

Si vous souhaitez utiliser OpenSSL, filtrez la sortie:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

Sous Linux (avec les outils GNU ou BusyBox), vous pouvez utiliser sha1sumce qui ne nécessite pas l'installation d'OpenSSL et a un format de sortie stable. Il imprime toujours un nom de fichier, alors retirez-le.

echo -n "foo" | sha1sum | sed 's/ .*//'

Sur les systèmes BSD, y compris OSX, vous pouvez utiliser sha1.

echo -n "foo" | sha1 -q

Tous ces éléments génèrent la somme de contrôle en hexadécimal suivi d'une nouvelle ligne. Le texte sous les systèmes Unix consiste toujours en une séquence de lignes, et chaque ligne se termine par un caractère de nouvelle ligne. Si vous stockez la sortie de la commande dans une variable shell, la nouvelle ligne finale est supprimée.

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

Si vous devez diriger l'entrée dans un programme qui nécessite une somme de contrôle sans retour à la ligne final (ce qui est vraiment rare), supprimez le retour à la ligne.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
Gilles, arrête de faire le mal
la source
c'est la situation parfaite => copier et coller la carte de solution. Merci!
oberstet
6

Voici une autre alternative:

echo -n "foo" | openssl sha1 | awk '{print $2}'
Vishnu Kumar
la source
1
Je sais que la question se pose avec ce format spécifique, cependant, si quelqu'un essaie d'étendre cela pour inclure les noms de fichiers, il pourrait se casser si le nom de fichier contient des espaces. Juste un avertissement pour d'autres personnes qui atterrissent ici.
Cameron Gagnon
2

Voici un moyen de le faire en utilisant les fonctions intégrées bash au lieu des tuyaux, awk, sed, tr, cut, etc.:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
al-x
la source