web-dev-qa-db-fra.com

Pourquoi les fichiers et les chaînes apparemment vides produisent-ils des sommes md5?

Considérer ce qui suit:

% md5sum /dev/null
d41d8cd98f00b204e9800998ecf8427e  /dev/null
% touch empty; md5sum empty
d41d8cd98f00b204e9800998ecf8427e  empty
% echo '' | md5sum
68b329da9893e34099c7d8ad5cb9c940  -
% Perl -e 'print chr(0)' | md5sum
93b885adfe0da089cdf634904fd59f71  -
% md5sum ''
md5sum: : No such file or directory

Tout d'abord, je suis surpris par la sortie de toutes ces commandes. Si quoi que ce soit, je m'attendrais à ce que la somme soit la même pour tous.

45
Daniel

La somme md5 de "rien" (un flux de caractères de longueur nulle) est d41d8cd98f00b204e9800998ecf8427e, que vous voyez dans vos deux premiers exemples.

Les troisième et quatrième exemples traitent un seul caractère. Dans le cas "écho", c'est une nouvelle ligne, c'est-à-dire.

$ echo -ne '\n' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -

Dans l'exemple Perl, il s'agit d'un seul octet avec la valeur 0x00, c'est-à-dire.

$ echo -ne '\x00' | md5sum
93b885adfe0da089cdf634904fd59f71 -

Vous pouvez reproduire la somme de contrôle vide en utilisant "echo" comme suit:

$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -

... et en utilisant Perl comme suit:

$ Perl -e 'print ""' | md5sum
d41d8cd98f00b204e9800998ecf8427e  -

Dans les quatre cas, vous devriez vous attendre à la même sortie de la somme de contrôle des mêmes données, mais des données différentes devraient produire une somme de contrôle très différente (c'est tout le point - même si ce n'est qu'un seul caractère qui diffère).

83
Graeme

Pourquoi les fichiers et chaînes apparemment vides produisent-ils des sommes md5?

Parce que le "sum" dans le md5sum est quelque peu trompeur. Ce n'est pas comme par exemple Somme de contrôle CRC32, qui est zéro pour le fichier vide.

MD5 est l'un des algorithmes de résumé des messages. Vous pouvez l'imaginer comme une boîte qui produit une valeur de recherche aléatoire de longueur fixe (hachage) en fonction de son état interne. Vous changez l'état interne en alimentant les données.

Et cet état interne de la boîte est prédéfini, de sorte qu'il donne une valeur de hachage à la recherche aléatoire avant même que des données ne soient introduites. Pour MD5, il se trouve être d41d8cd98f00b204e9800998ecf8427e.

12
mykhal

Pas besoin de surprise. Les deux premiers produisent de véritables entrées vides pour md5sum. L'écho produit une nouvelle ligne (echo -n '' devrait produire une sortie vide; Je n'ai pas de machine Linux ici pour vérifier). Le Perl produit un seul octet zéro (à ne pas confondre avec C où un octet zéro marque la fin de la chaîne). La dernière commande recherche un fichier avec la chaîne vide comme nom de fichier.

2
Gene