2012-06-06 14 views
30

Rozważmy następujący:Dlaczego pozornie puste pliki i łańcuchy generują sumy md5?

% 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 

Przede wszystkim, jestem zaskoczony przez wyjście wszystkich tych poleceń. Jeśli cokolwiek, oczekiwałbym, że suma będzie taka sama dla wszystkich.

Odpowiedz

64

Md5sum "nic" (strumień znaków o zerowej długości) to d41d8cd98f00b204e9800998ecf8427e, które widzisz w pierwszych dwóch przykładach.

Trzeci i czwarty przykład to przetwarzanie pojedynczego znaku. W „echo” sprawy, to znak nowej linii, czyli

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

w Perl przykład to jeden bajt o wartości 0x00, czyli

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

można odtworzyć pusty kontrolną z użyciem „echo” w następujący sposób:

$ echo -n '' | md5sum 
d41d8cd98f00b204e9800998ecf8427e - 

... i przy użyciu Perl następująco:

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

We wszystkich czterech przypadkach powinieneś oczekiwać tego samego wyniku sprawdzania tych samych danych, ale inne dane powinny generować szalenie różną sumę kontrolną (to jest cały punkt - nawet jeśli różni się tylko jeden znak).

+1

... lub 'perl -e ''' – minmaxavg

2

Nie trzeba się dziwić. Pierwsze dwa dają prawdziwe puste wejścia do md5sum. Echo tworzy znak nowej linii (echo -n '' powinien wytworzyć puste wyjście, ja nie mam tutaj komputera z linuxem do sprawdzenia). Perl tworzy pojedynczy bajt zerowy (nie mylić z C, gdzie zero bajtów oznacza koniec łańcucha). Ostatnie polecenie szuka pliku z pustym ciągiem jako nazwą pliku.

6

Dlaczego pozornie puste pliki i łańcuchy generują sumy md5?

Ponieważ "suma" w md5sum jest nieco mylący. To nie jest jak na przykład Suma kontrolna CRC32, czyli zero dla pustego pliku.

MD5 jest jednym z algorytmów trawienia wiadomości. Możesz sobie wyobrazić, że jest to pudełko, które tworzy losowo wyglądającą wartość (hash) o stałej długości, w zależności od jej stanu wewnętrznego. Zmieniasz stan wewnętrzny, podając dane.

Ten wewnętrzny stan skrzynki jest wstępnie zdefiniowany, tak że daje losowo wyglądającą wartość hash, nawet zanim dane zostaną podane. W przypadku MD5 zdarza się, że jest to d41d8cd98f00b204e9800998ecf8427e.

+0

Aby być trochę dokładniejszym: MD5 wewnętrznie doda blok dopełniający na końcu wiadomości. W związku z tym wartość mieszania jest wynikiem chrupania funkcji mieszania na tym bloku dopełniającym, a nie dokładnie stanu początkowego. – nneonneo