Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

Aucune réponse
Avatar
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

7 réponses

Avatar
Pascal J. Bourguignon
Olivier Miakinen <om+ writes:
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
Avatar
Olivier Miakinen
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
Avatar
Nicolas George
Olivier Miakinen , dans le message <q2dlln$18ap$,
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.
Avatar
Olivier Miakinen
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
Avatar
Nicolas George
Olivier Miakinen , dans le message <q2egl8$1fv6$,
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 :
« "%sn" ».
sha256sum|sed -e 's/ *-//')

Note : « cut -c 1-64 » sera un substitut intéressant à sed.
Avatar
Olivier Miakinen
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 :
« "%sn" ».

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
Avatar
doudou971
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 :
« "%sn" ».
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 :)