=c2=ab hacher =c2=bb une cha=c3=aene dans un script shell

Le
Olivier Miakinen
Bonjour,

Dans un script shell (vraisemblablement bash), je vais avoir le
besoin suivant.

À partir d'une chaîne de caractères à peu près quelconques (choisis
quand même dans les caractères ASCII imprimables, donc de code ASCII
compris entre 32 et 126), et de longueur quelconque, je voudrais
obtenir une chaîne de longueur fixe ne comportant que des chiffres
ou des lettres.

Je n'ai aucun besoin d'une sécurité forte, donc un hachage de type
sha1sum ou md5sum me conviendrait parfaitement (mais il peut exister
quelque chose de plus simple auquel je n'aurais pas pensé, ne pas
hésiter à me faire d'autres propositions).

la chaîne de caractères de départ est dans une variable (mettons
par exemple $input) et je voudrais obtenir le résultat dans une
autre variable (par exemple $output).

Pour le moment, le code le moins complexe que j'ai trouvé est le
suivant :
##########################################
input='This is an "example" #@<>'

tmp=$(md5sum << blablabla
$input
blablabla
)

output=$(sed 's/ *-//' << blablabla
$tmp
blablabla
)

echo $output
##########################################

qui donne comme résultat :
e3fd21b3c4ac587892b8cd0693507adc

Est-ce que je pourrais faire mieux ou plus simple ?

Cordialement,
--
Olivier Miakinen
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal J. Bourguignon
Le #26506946
Olivier Miakinen
Bonjour,
Dans un script shell (vraisemblablement bash), je vais avoir le
besoin suivant.
À partir d'une chaîne de caractères à peu près quelconques (choisis
quand même dans les caractères ASCII imprimables, donc de code ASCII
compris entre 32 et 126), et de longueur quelconque, je voudrais
obtenir une chaîne de longueur fixe ne comportant que des chiffres
ou des lettres.
Je n'ai aucun besoin d'une sécurité forte, donc un hachage de type
sha1sum ou md5sum me conviendrait parfaitement (mais il peut exister
quelque chose de plus simple auquel je n'aurais pas pensé, ne pas
hésiter à me faire d'autres propositions).
la chaîne de caractères de départ est dans une variable (mettons
par exemple $input) et je voudrais obtenir le résultat dans une
autre variable (par exemple $output).
Pour le moment, le code le moins complexe que j'ai trouvé est le
suivant :
##########################################
input='This is an "example" #@<>'
tmp=$(md5sum << blablabla
$input
blablabla
)
output=$(sed 's/ *-//' << blablabla
$tmp
blablabla
)
echo $output
##########################################
... qui donne comme résultat :
e3fd21b3c4ac587892b8cd0693507adc
Est-ce que je pourrais faire mieux ou plus simple ?

Simplement, utilise une des commandes sha*sum au lieu de md5sum.
for input in "Hello world" "Hello World" ; do
sum=$(echo -n "$input"|sha256sum|sed -e 's/ *-//')
printf "%s %sn" "$sum" "$input"
done
--
__Pascal J. Bourguignon__
http://www.informatimago.com
Olivier Miakinen
Le #26506947
Bonjour Pascal,
Quelle rapidité ! Je ne m'attendais pas à avoir une réponse si vite !
Le 25/01/2019 01:24, Pascal J. Bourguignon a écrit :
Simplement, utilise une des commandes sha*sum au lieu de md5sum.

Ça, peu importe. Comme je le disais, il n'y a aucun enjeu de sécurité.
Cela dit, ok, je veux bien utiliser sha256sum. Mais surtout :
for input in "Hello world" "Hello World" ; do
sum=$(echo -n "$input"|sha256sum|sed -e 's/ *-//')

Mais oui, bien sûr ! Pourquoi j'allais m'embêter avec des « << » ?
Un grand merci pour cette syntaxe beaucoup plus simple.
printf "%s %sn" "$sum" "$input"
done

Eh bien voilà, problème résolu. Merci !
--
Olivier Miakinen
Nicolas George
Le #26506962
Olivier Miakinen , dans le message a écrit :
sum=$(echo -n "$input"|sha256sum|sed -e 's/ *-//')

Mais oui, bien sûr ! Pourquoi j'allais m'embêter avec des « << » ?

Pour éviter une commande supplémentaire. Attention, echo est peu
standardisé, préférer printf.
Olivier Miakinen
Le #26506967
Le 25/01/2019 08:34, Nicolas George a écrit :
sum=$(echo -n "$input"|sha256sum|sed -e 's/ *-//')

Mais oui, bien sûr ! Pourquoi j'allais m'embêter avec des « << » ?

Pour éviter une commande supplémentaire.

Certes, mais au prix de la longueur du code et d'une moindre lisibilité.
Attention, echo est peu standardisé, préférer printf.

En effet, il faut vraiment que je m'y habitue.
Donc :
sum=$(printf "%s" "$input"|sha256sum|sed -e 's/ *-//')
Ou, puisque ça ne fait pas de différence à partir du moment où je fais
partout pareil :
sum=$(printf "%sn" "$input"|sha256sum|sed -e 's/ *-//')
--
Olivier Miakinen
Nicolas George
Le #26507012
Olivier Miakinen , dans le message a écrit :
Ou, puisque ça ne fait pas de différence à partir du moment où je fais
partout pareil :

Un petit peu quand même dans la mesure où SHA-256 est standardisé,
savoir exactement sur quoi on le calcule est intéressant.
sum=$(printf "%sn" "$input"|

Je déconseille les backslashes seuls dans des guillemets doubles :
« "%s\n" ».
sha256sum|sed -e 's/ *-//')

Note : « cut -c 1-64 » sera un substitut intéressant à sed.
Olivier Miakinen
Le #26507035
Le 25/01/2019 16:24, Nicolas George a écrit :
Ou, puisque ça ne fait pas de différence à partir du moment où je fais
partout pareil :

Un petit peu quand même dans la mesure où SHA-256 est standardisé,
savoir exactement sur quoi on le calcule est intéressant.

Je n'ai pas encore expliqué à quoi ce script devait servir, mais je
t'assure qu'on s'en fout : il suffit que si on lance le script deux
fois dans la même journée, sur la même chaîne, et sur la même machine,
ça retourne la même valeur (et si possible des valeurs différentes
en partant de chaînes différentes).
Si cela t'intéresse de comprendre le contexte, va voir la discussion
« Just a test :) » sur fr.test (oui, je sais, en principe ce n'est
pas un groupe pour discuter, mais là ça se justifie).
sum=$(printf "%sn" "$input"|

Je déconseille les backslashes seuls dans des guillemets doubles :
« "%s\n" ».

Exact. Bon, j'ai mis ceinture et bretelles : des guillemets simples
et plus aucun backslash, à savoir '%s'.
sha256sum|sed -e 's/ *-//')

Note : « cut -c 1-64 » sera un substitut intéressant à sed.

Adopté.
Cordialement,
--
Olivier Miakinen
doudou971 Hors ligne
Le #26519417
Le vendredi 25 Janvier 2019 à 16:24 par Nicolas George :
Olivier Miakinen , dans le message
a écrit :
Ou, puisque ça ne fait pas de différence à partir du
moment où je fais
partout pareil :

Un petit peu quand même dans la mesure où SHA-256 est
standardisé,
savoir exactement sur quoi on le calcule est intéressant.

sum=$(printf "%sn" "$input"|

Je déconseille les backslashes seuls dans des guillemets doubles :
« "%s\n" ».

sha256sum|sed -e 's/ *-//')

Note : « cut -c 1-64 » sera un substitut
intéressant à sed.


"Je déconseille les backslashes seuls dans des guillemets doubles :"

Très bon déconseil :)
Publicité
Poster une réponse
Anonyme