2012-06-06 13 views
30

Folgendes zu beachten:Warum produzieren scheinbar leere Dateien und Zeichenketten md5sums?

% 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 

Zunächst einmal bin ich durch die Ausgabe aller dieser Befehle überrascht. Wenn überhaupt, würde ich erwarten, dass die Summe für alle gleich ist.

Antwort

64

Die md5sum von "nichts" (ein Null-Länge Strom von Zeichen) ist d41d8cd98f00b204e9800998ecf8427e, die Sie in Ihren ersten beiden Beispielen sehen.

Das dritte und vierte Beispiel verarbeiten ein einzelnes Zeichen. In dem "Echo" Fall ist es ein Newline, dh

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

Im Perl Beispiel, es ist ein einziges Byte mit dem Wert 0x00, dh

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

Sie können die leeren Prüfsumme mit "echo" reproduzieren wie folgt:

$ echo -n '' | md5sum 
d41d8cd98f00b204e9800998ecf8427e - 

... und mit Perl wie folgt:

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

In allen vier Fällen sollten Sie die gleiche Ausgabe erwarten, wenn die gleichen Daten geprüft werden, aber unterschiedliche Daten sollten eine völlig andere Prüfsumme ergeben (das ist der springende Punkt - auch wenn nur ein einzelnes Zeichen unterschiedlich ist.)

+1

... oder 'perl -e ''' – minmaxavg

2

Keine Überraschung. Die ersten beiden erzeugen echte leere Eingaben für md5sum. Das Echo erzeugt eine neue Zeile (echo -n '' sollte eine leere Ausgabe erzeugen; ich habe hier keine Linux-Maschine zum Prüfen). Das Perl erzeugt ein einzelnes Null-Byte (nicht zu verwechseln mit C, wo ein Null-Byte das Ende des Strings markiert). Der letzte Befehl sucht nach einer Datei mit der leeren Zeichenfolge als Dateiname.

6

Warum produzieren scheinbar leere Dateien und Zeichenketten md5sums?

Da die "Summe" in der md5sum etwas irreführend ist. Es ist nicht wie z.B. CRC32 Prüfsumme, das ist Null für die leere Datei.

MD5 ist einer der Message Digest-Algorithmen. Sie können es sich als eine Box vorstellen, die abhängig von ihrem internen Zustand einen zufälligen Wert mit fester Länge (Hash) erzeugt. Sie ändern den internen Zustand, indem Sie die Daten einspeisen.

Und dieser Box-interne Zustand ist vordefiniert, so dass es zufällige Hash-Wert ergibt, noch bevor irgendwelche Daten eingegeben werden. Für MD5 ist es zufällig d41d8cd98f00b204e9800998ecf8427e.

+0

Um ein wenig genauer zu sein: MD5 wird intern einen Füllblock am Ende der Nachricht hinzufügen. Somit ist der Hash-Wert das Ergebnis des Knackens der Hash-Funktion auf diesem Auffüllblock, nicht genau des Anfangszustands. – nneonneo