2012-06-06 22 views
30

xem xét như sau:Tại sao các tệp và chuỗi có vẻ trống rỗng sản xuất 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 

Trước hết, tôi rất ngạc nhiên bởi sản lượng của tất cả các lệnh này. Nếu bất cứ điều gì, tôi sẽ mong đợi số tiền là như nhau cho tất cả chúng.

Trả lời

64

Md5sum của "không có gì" (một dòng có độ dài bằng 0 ký tự) là d41d8cd98f00b204e9800998ecf8427e, mà bạn đang thấy trong hai ví dụ đầu tiên của mình.

Ví dụ thứ ba và thứ tư đang xử lý một ký tự đơn. Trong mục "echo" trường hợp, đó là một dòng mới, tức là

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

Trong ví dụ perl, đó là một byte đơn có giá trị 0x00, tức là

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

Bạn có thể tái tạo các checksum trống sử dụng "echo" như sau:

$ echo -n '' | md5sum 
d41d8cd98f00b204e9800998ecf8427e - 

... và sử dụng Perl như sau:

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

Trong tất cả bốn trường hợp, bạn nên mong đợi cùng một kết quả từ việc kiểm tra cùng một dữ liệu, nhưng dữ liệu khác nhau sẽ tạo ra một tổng kiểm tra cực kỳ khác nhau (đó là toàn bộ điểm - ngay cả khi nó chỉ là một ký tự khác nhau.)

+1

... hoặc 'perl -e' '' – minmaxavg

2

Không cần bất ngờ. Hai đầu tiên tạo ra các đầu vào trống thực sự cho md5sum. Các echo tạo ra một dòng mới (echo -n '' nên sản xuất một sản lượng nào, tôi không có một máy linux ở đây để kiểm tra). Perl tạo ra một byte số không (không bị nhầm lẫn với C trong đó một byte bằng không đánh dấu kết thúc chuỗi). Lệnh cuối cùng là tìm kiếm một tệp có chuỗi rỗng làm tên tệp của nó.

6

Tại sao các tệp và chuỗi có vẻ trống rỗng sản xuất md5sums?

Bởi vì "tổng" trong md5sum có phần sai lệch. Nó không giống như ví dụ CRC32 checksum, đó là số không cho tệp trống.

MD5 là một trong các thuật toán thông báo tiêu hóa. Bạn có thể tưởng tượng nó như một hộp tạo ra giá trị tìm kiếm ngẫu nhiên có độ dài cố định (băm) tùy thuộc vào trạng thái bên trong của nó. Bạn thay đổi trạng thái bên trong bằng cách nạp dữ liệu vào.

Và trạng thái nội bộ hộp đó được xác định trước, sao cho nó mang lại giá trị băm tìm kiếm ngẫu nhiên ngay cả trước khi bất kỳ dữ liệu nào được nạp. Đối với MD5, nó xảy ra là d41d8cd98f00b204e9800998ecf8427e.

+0

Để chính xác hơn một chút: MD5 sẽ thêm nội bộ khối đệm vào cuối thư. Do đó, giá trị băm là kết quả của việc băm hàm băm trên khối đệm này, không chính xác trạng thái ban đầu. – nneonneo

Các vấn đề liên quan