Liệu một mã băm hoặc tổng kiểm tra mã hóa giống hệt nhau cho hai tệp có nghĩa là chúng giống hệt nhau không?


57

Tôi có 2 tài liệu excel và tôi muốn kiểm tra xem chúng có giống hệt nhau không, ngoài tên tệp.

Ví dụ, các tập tin được gọi fileone.xlsfiletwo.xls. Ngoài tên tệp, nội dung của chúng được cho là giống hệt nhau nhưng đây là những gì tôi muốn kiểm tra.

Tôi đã tìm cách để xem lại cái này và không cần cài đặt một loạt các plugin. Có vẻ như không có cách nào thẳng tiến.

Tôi đã thử tạo băm MD5 cho cả hai tệp. Khi các giá trị băm giống hệt nhau, điều này có nghĩa là nội dung tệp là 1: 1 giống nhau không?


8
mã hóa và đôi khi cả băm bình thường có thể hữu ích để so sánh các tệp trên các hệ thống khác nhau hoặc tìm kiếm giữa một số lượng lớn tệp, nhưng nếu hai tệp trên cùng một hệ thống, bạn có thể dễ dàng so sánh chúng với cmpUnix hoặc fc(so sánh tệp) trên Windows.
dave_thndry_085

10
shatter.io - SHA1 là thuật toán băm "mạnh hơn" so với md5 và vẫn bị phá vỡ.io / static / shatter-1.pdfshatter.io/static/shatter-2.pdf có cùng giá trị băm trong khi hoàn toàn khác nhau.
xốp bay

30
Lưu ý bên: kiểm tra kích thước của họ đầu tiên. Nếu chúng có kích thước khác nhau, đừng bận tâm mở các tệp, chúng sẽ khác nhau.
Emilio M Bumachar

42
Phiên bản đơn giản: băm MD5 đủ tốt để bảo vệ chống lại tai nạn , nó không đủ tốt để ngăn chặn sự độc hại . Cho dù điều đó đủ tốt cho bạn, bạn phải quyết định dựa trên hoàn cảnh của mình.
Euro Micelli

9
diff -s file1 file2nếu nó nói chúng giống hệt nhau, chúng giống hệt nhau (nó thực sự so sánh các tệp byte trên mỗi byte nên thậm chí các xung đột băm cũng bị loại trừ). tổng kiểm tra được sử dụng khi bạn chỉ có một hàm băm và một vật phẩm được cho là giống hệt với người khởi tạo của hàm băm đó.
Bakuriu

Câu trả lời:


92

Khi các giá trị băm giống hệt nhau, điều này có nghĩa là nội dung tệp là 1: 1 giống nhau không?

Tất cả các tệp là một tập hợp các byte (giá trị 0-255). Nếu hai tệp băm MD5 khớp nhau, cả hai tập hợp byte đó rất có thể giống hệt nhau (cùng thứ tự, cùng giá trị).

Có một cơ hội rất nhỏ rằng hai tệp có thể tạo cùng một MD5, đó là hàm băm 128 bit. Xác suất là:

Xác suất chỉ có hai băm vô tình va chạm là 1/2 128 , tức là 1 trong 340 tỷ tỷ 282 tỷ 365 tỷ không phải là 920 triệu 938 triệu 463 triệu 463 triệu 374 nghìn tỷ 607 nghìn tỷ 432 tỷ 768 triệu 211 nghìn 456. (từ một câu trả lời trên StackOver ).

Băm có nghĩa là chỉ hoạt động theo "một hướng" - tức là bạn lấy một tập hợp các byte và lấy một hàm băm, nhưng bạn không thể lấy một hàm băm và lấy lại một tập hợp các byte.

Mật mã học phụ thuộc vào điều này (đó là một cách có thể so sánh hai thứ mà không cần biết những thứ đó là gì.)

Vào khoảng năm 2005, các phương thức đã được phát hiện để lấy băm MD5 và tạo dữ liệu khớp với hàm băm đó tạo ra hai tài liệu có cùng hàm băm MD5 ( tấn công va chạm ). Xem bình luận của @ user2357112 bên dưới. Điều này có nghĩa là kẻ tấn công có thể tạo hai thực thi, ví dụ, có cùng MD5 và nếu bạn phụ thuộc vào MD5 để xác định tin cậy nào, bạn sẽ bị lừa.

Do đó MD5 không nên được sử dụng cho mật mã hoặc bảo mật. Thật tệ khi xuất bản MD5 trên một trang tải xuống để đảm bảo tính toàn vẹn tải xuống, chẳng hạn. Tùy thuộc vào hàm băm MD5 mà bạn không tự tạo để xác minh nội dung tệp hoặc dữ liệu là điều bạn muốn tránh.

Nếu bạn tự tạo, bạn biết bạn không độc hại với chính mình (hy vọng). Vì vậy, với mục đích sử dụng của bạn, không sao, nhưng nếu bạn muốn người khác có thể sao chép nó và bạn muốn xuất bản công khai hàm băm MD5, nên sử dụng hàm băm tốt hơn.


Lưu ý rằng hai tệp Excel có thể chứa cùng một giá trị trong cùng một hàng và cột, nhưng đối với luồng phụ của tệp hoàn toàn khác nhau do định dạng, kiểu, cài đặt khác nhau, v.v.

Nếu bạn muốn so sánh dữ liệu trong tệp, trước tiên hãy xuất dữ liệu đó sang CSV với cùng một hàng và cột, để loại bỏ tất cả định dạng, sau đó băm hoặc so sánh các CSV.


107
Các tệp Excel và các tài liệu văn phòng khác cũng có thể có các giá trị băm khác nhau vì chúng đã được mở và lưu lại mà không thay đổi bất cứ điều gì, do siêu dữ liệu trong tệp có giá trị mới được lưu trữ trong đó cho thời gian lưu cuối cùng.
BeowulfNode42

29
Phần thưởng: nếu bạn đã xuất sang CSV, bạn có thể sử dụng difftiện ích tương tự hoặc tương tự để thực sự xác nhận các tệp giống nhau theo từng byte, thay vì chỉ có cùng một hàm băm.
Monty Harder

18
Lấy một hàm băm và tạo dữ liệu khớp với hàm băm là một cuộc tấn công tiền tố. Tôi tin rằng MD5 hiện dễ bị tấn công do va chạm, nhưng tôi không nghĩ rằng các cuộc tấn công tiền tố hoặc tiền giả thứ hai hiện đang khả thi.
user2357112

2
@Tim bạn đang nói gì vậy? Ông nói: xuất chúng sang CSV và sử dụng diff -sđể kiểm tra xem CSV có giống nhau không. Trong thực tế, bạn diff -sthậm chí có thể các tệp excel: nếu diffnói chúng giống hệt nhau, bạn không cần phải đi đến so sánh CSV.
Bakuriu

2
@Bakuriu Rõ ràng nhận xét của tôi rất kém chữ - Tôi có nghĩa là xuất sang CSV sẽ mất rất nhiều thông tin - đáng chú ý là các công thức, biểu đồ, định dạng có điều kiện và tiêu chuẩn.
Tim

37

Trong thực tế, vâng, một hàm băm mật mã giống hệt nhau có nghĩa là các tệp giống nhau, miễn là các tệp không được tạo bởi kẻ tấn công hoặc thực thể độc hại khác. Tỷ lệ va chạm ngẫu nhiên với bất kỳ hàm băm mật mã được thiết kế tốt là rất nhỏ đến mức không đáng kể trong thực tế và trong trường hợp không có kẻ tấn công hoạt động.

Nói chung, tuy nhiên, không, chúng ta không thể nói rằng hai tập tin tùy ý có băm cùng chắc chắn có nghĩa rằng họ là giống hệt nhau.

Cách thức hoạt động của hàm băm mật mã là lấy đầu vào có độ dài tùy ý và xuất giá trị độ dài cố định được tính từ đầu vào. Một số hàm băm có nhiều độ dài đầu ra để lựa chọn, nhưng đầu ra vẫn ở một mức độ nào đó là giá trị độ dài cố định. Giá trị này sẽ dài tới vài chục byte; các thuật toán băm có giá trị đầu ra dài nhất được sử dụng phổ biến hiện nay có đầu ra 512 bit và đầu ra 512 bit là 64 byte.

Nếu một đầu vào cho hàm băm dài hơn đầu ra của hàm băm, một số độ trung thực phải được loại bỏ để làm cho đầu vào phù hợp với đầu ra. Do đó, phải tồn tại nhiều đầu vào có độ dài lớn hơn độ dài của đầu ra, tạo ra cùng một đầu ra.

Hãy lấy ví dụ hiện tại, SHA-256 làm ví dụ. Nó xuất ra một hàm băm 256 bit hoặc 32 byte. Nếu bạn có hai tệp có độ dài chính xác 32 byte, nhưng khác nhau, những tệp này (giả sử không có lỗ hổng trong thuật toán) băm vào các giá trị khác nhau, bất kể nội dung của các tệp; trong thuật ngữ toán học, hàm băm là một hàm ánh xạ không gian đầu vào 2 256 lên không gian đầu ra 2 256 , có thể thực hiện mà không cần va chạm. Tuy nhiên, nếu bạn có hai tệp dài 33 byte, thì phải tồn tại một số tổ hợp đầu vào có cùng giá trị băm đầu ra 32 byte cho cả hai tệp, vì chúng tôi hiện đang ánh xạ không gian đầu vào 2 264 lên 2 256không gian đầu ra; Ở đây, chúng ta có thể dễ dàng thấy rằng, trung bình, nên tồn tại 2 8 đầu vào cho mỗi đầu ra. Thực hiện điều này hơn nữa và với các tệp 64 byte nên tồn tại 2 256 đầu vào cho mỗi đầu ra!

Các hàm băm mật mã được thiết kế sao cho khó tính toán một đầu vào cung cấp một đầu ra cụ thể hoặc kết hợp hai đầu vào cung cấp cùng một đầu ra. Điều này được gọi là kháng tấn công tiền tố hoặc kháng tấn công va chạm . Không thể tìm thấy những va chạm này; nó chỉ nhằm mục đích thực sự, thực sự, thực sự, thực sự khó khăn. (Một chút trường hợp đặc biệt của một cuộc tấn công va chạm là một cuộc tấn công sinh nhật .)

Một số thuật toán tốt hơn những thuật toán khác trong việc chống lại những kẻ tấn công. MD5 thường được coi là hoàn toàn bị phá vỡ trong những ngày này, nhưng cuối cùng tôi đã nhìn thấy, nó vẫn có khả năng kháng tiền đầu tiên khá tốt . SHA-1 cũng bị phá vỡ hiệu quả; các cuộc tấn công tiền giả đã được chứng minh, nhưng đòi hỏi các điều kiện cụ thể, mặc dù không có lý do nào để tin rằng đó sẽ là trường hợp vô thời hạn; như người ta vẫn nói, các cuộc tấn công luôn trở nên tốt hơn, chúng không bao giờ trở nên tồi tệ hơn. SHA-256/384/512 hiện vẫn được cho là an toàn cho hầu hết các mục đích. Tuy nhiên , nếu bạn chỉ muốn xem liệu hai thứ không độc hại, hợp lệcác tệp là như nhau, sau đó bất kỳ tệp nào trong số này cũng đủ, bởi vì không gian đầu vào đã bị hạn chế đủ, bạn sẽ chủ yếu quan tâm đến các xung đột ngẫu nhiên. Nếu bạn có bất kỳ lý do nào để tin rằng các tệp được tạo độc hại, thì ít nhất bạn cần sử dụng hàm băm mật mã hiện được cho là an toàn, đặt thanh thấp hơn ở SHA-256.

Tiền đề đầu tiên là tìm một đầu vào mang lại giá trị băm đầu ra cụ thể; tiền đề thứ hai là tìm một đầu vào cung cấp cùng một đầu ra với đầu vào được chỉ định khác; va chạm là tìm ra hai đầu vào mang lại cùng một đầu ra, mà không quan tâm đến đó là gì và đôi khi không liên quan đến đầu vào là gì.

Tất cả những gì đã nói, điều quan trọng cần lưu ý là các tệp có thể có các biểu diễn dữ liệu rất khác nhau và vẫn hiển thị chính xác như nhau. Vì vậy, chúng có thể giống nhau mặc dù các giá trị băm mật mã của chúng không khớp, nhưng nếu các giá trị băm khớp với nhau thì chúng cực kỳ có khả năng xuất hiện giống nhau.


2
Nếu các giá trị băm khớp nhau thì các tệp đó là kết quả của sự va chạm có chủ ý hoặc chúng không được bảo đảm và chúng được đảm bảo giống nhau. Xác suất va chạm vô tình hoàn toàn là lý thuyết. Nói rằng, nếu băm khớp với nhau thì rất có thể chúng sẽ xuất hiện cùng một tên lửa đó là sai lầm: nếu có ác ý xảy ra và đó là một tình huống va chạm thì chúng có thể không giống nhau, và nếu không thì xác suất là 0 'một số sự kiện có xác suất thấp cần được bảo vệ chống lại.
Gilles 'SO- ngừng trở nên xấu xa'

9
@Gilles: Ngược lại. Từ ngữ của Michael là hoàn toàn chính xác, và "được bảo đảm" là sai lệch (hoặc, tốt, thực tế sai). Khả năng hai tệp có băm giống hệt nhau không khớp (mặc dù có sửa đổi độc hại) là rất thấp và có thể bị bỏ qua trong thực tế. Tuy nhiên, nó không phải là không . Nhìn chung có một cơ hội, vì bất kỳ lý do gì, các đầu vào khác nhau sẽ tạo ra cùng một hàm băm và thậm chí có khả năng cao hơn 2 ^ -128 (thuật toán mã hóa là nghệ thuật đen, thuật toán đại số có thể bị sai sót một cách tinh vi, không rõ và chúng tôi không có cách nào chắc chắn 100%).
Damon

5
@Gilles " hiệu quả bằng không " vẫn không phải là số không , điều đó có nghĩa là vẫn còn một số xác suất (nhỏ được thừa nhận) rằng hai bộ dữ liệu khác nhau sẽ dẫn đến cùng một hàm băm. Bạn không thể tranh luận về điều đó.
Attie

5
@Attie: Xác suất hai tệp không liên quan băm đến cùng một giá trị thấp hơn nhiều so với xác suất của nhiều thứ khác có thể sai (ví dụ: lỗi bit ngẫu nhiên làm hỏng các tệp trên đĩa) mà không đáng để bảo vệ trước các kết quả trùng khớp. Bảo vệ chống lại các trận đấu được thiết kế có chủ ý có thể đáng giá, nhưng các trận đấu tình cờ là không thể thực hiện được đến nỗi mọi nỗ lực bảo vệ chống lại chúng có thể được chi tiêu tốt hơn ở nơi khác.
supercat

3
@Gilles sai. Bạn không thể trong một hơi thở nói với tôi rằng có một cơ hội, dù bạn đánh giá nó nhỏ đến mức nào, rằng một vụ va chạm vô tình có thể xảy ra sau đó ở người được cấp quyền tiếp theo, không có vụ va chạm nào có thể xảy ra. Nói rằng đó là sai lệch cao vì nó ngụ ý một thuộc tính của thuật toán băm đã được biết là hoàn toàn sai.
iheanyi

10

Đây là một trò chơi xác suất ... băm có thể biểu thị một số lượng giá trị hữu hạn.

Nếu chúng ta xem xét một thuật toán băm 8 bit giả định (và rất yếu), thì điều này có thể đại diện cho 256 giá trị riêng biệt. Khi bạn bắt đầu chạy các tệp thông qua thuật toán, bạn sẽ bắt đầu nhận được băm ... nhưng không lâu sau, bạn sẽ bắt đầu thấy " va chạm băm ". Điều này có nghĩa là hai tệp khác nhau được đưa vào thuật toán và nó tạo ra giá trị băm giống như đầu ra của nó. Rõ ràng ở đây, hàm băm không đủ mạnh và chúng tôi không thể khẳng định rằng " các tệp có băm phù hợp có cùng nội dung ".

Mở rộng kích thước của hàm băm và sử dụng thuật toán băm mật mã mạnh hơn có thể giúp giảm đáng kể va chạm và tăng sự tin tưởng của chúng tôi rằng hai tệp có cùng hàm băm có cùng một nội dung.

Điều này nói rằng, chúng tôi không bao giờ có thể đạt được sự chắc chắn 100% - chúng tôi không bao giờ có thể tuyên bố chắc chắn rằng hai tệp có cùng hàm băm thực sự có cùng một nội dung.

Trong hầu hết / nhiều tình huống, điều này là tốt và so sánh băm là " đủ tốt ", nhưng điều này phụ thuộc vào mô hình mối đe dọa của bạn.

Cuối cùng, nếu bạn cần nâng mức độ chắc chắn, thì tôi khuyên bạn nên làm như sau:

  1. Sử dụng thuật toán băm mạnh ( MD5 không còn được coi là đầy đủ nếu bạn cần bảo vệ chống lại người dùng độc hại tiềm ẩn)
  2. Sử dụng nhiều thuật toán băm
  3. So sánh kích thước của các tệp - một điểm dữ liệu bổ sung có thể giúp xác định các xung đột tiềm ẩn, nhưng lưu ý rằng xung đột MD5 đã được chứng minh không cần thay đổi độ dài của dữ liệu.

Nếu bạn cần chắc chắn 100%, thì bằng mọi cách hãy bắt đầu bằng hàm băm, nhưng nếu giá trị băm khớp, hãy theo dõi nó bằng cách so sánh từng byte của hai tệp.


Ngoài ra, như được chỉ ra bởi những người khác ... độ phức tạp của các tài liệu được tạo bởi các ứng dụng như Word và Excel có nghĩa là văn bản, số, bố cục hiển thị có thể giống nhau, nhưng dữ liệu được lưu trữ trong tệp có thể khác nhau.

Excel đặc biệt tệ ở việc này - chỉ cần mở một bảng tính lưu nó (không làm gì cả ) có thể tạo ra một tệp mới, với nội dung khác nhau.


6
MD5 không còn được coi là đầy đủ là rất đúng về mặt mật mã nhưng để kiểm tra tính duy nhất (trong trường hợp không có ác ý, ví dụ: nếu bạn kiểm soát đầu vào), nó rất hay và nhanh (và 128 bit sẽ rất nhiều)
Chris H

4
" theo dõi nó bằng cách so sánh từng byte của hai tệp. " Nếu bạn định thực hiện so sánh tệp, trước tiên bạn cũng có thể làm điều đó ... không cần phải đọc tất cả các tệp để tính toán chúng băm chỉ để đọc lại cả hai tập tin để so sánh chúng!
TripeHound

3
@TripeHound Tùy thuộc vào việc các tệp có phải là cục bộ hay không ... nếu bạn đã có một hàm băm của một tệp và đang giới thiệu một tệp mới cho hệ thống, nếu tệp mới cần một hàm băm được lưu trữ trong cơ sở dữ liệu, v.v ... Thực hiện cuộc gọi phù hợp với tình huống của bạn.
Attie

5
Không, nó không phải là một trò chơi xác suất. Bạn đang đánh giá sai khả năng xảy ra va chạm vô tình. Nó sẽ không xảy ra. Lật một chút trong quá trình so sánh có nhiều khả năng. Mặt khác, trong một số tình huống, một vụ va chạm có chủ ý có thể xảy ra và đó hoàn toàn không phải là một trò chơi xác suất.
Gilles 'SO- ngừng trở nên xấu xa'

3
@mbrig: Băm 32 bit sẽ có nguy cơ không khớp ngẫu nhiên. Tuy nhiên, đi tới 128 hoặc 256 bit, tạo ra sự khác biệt rất lớn . Với 128 bit, một tỷ con khỉ mỗi lần gõ một tỷ tài liệu ngẫu nhiên có kích thước thực sự sẽ có khoảng 0,3% cơ hội tạo hai tài liệu có cùng hàm băm. Với 256 bit, ngay cả khi hàng tỷ con khỉ có thể gõ một tỷ tài liệu ngẫu nhiên có kích thước vừa phải mỗi giây trong một tỷ năm, khả năng bất kỳ tài liệu nào trong số các tài liệu có giá trị băm trùng khớp ngẫu nhiên này sẽ rất nhỏ.
supercat

6

Nếu hai tệp có cùng hàm băm MD5 và cả hai đều không được chế tạo đặc biệt, thì chúng giống hệt nhau. Việc tạo các tệp với cùng hàm băm MD5 khó đến mức nào tùy thuộc vào định dạng tệp, tôi không biết nó dễ dàng như thế nào với các tệp Excel.

Vì vậy, nếu bạn có các tệp của riêng mình chỉ nằm xung quanh và muốn tìm bản sao, MD5 vẫn an toàn. Nếu bạn đã viết một trong các tệp và tệp khác có nguồn gốc đáng ngờ, MD5 vẫn an toàn (cách duy nhất để có được các tệp khác nhau với cùng một tổng kiểm tra MD5 là tạo cả hai tệp). Nếu ai đó bạn không tin tưởng sẽ gửi cho bạn một đề xuất ngân sách và sau đó gửi một tệp khác mà họ cho là giống nhau, thì MD5 có thể không đủ.

Để tránh mọi rủi ro, hãy sử dụng SHA-256 hoặc SHA-512 thay vì MD5. Nếu hai tệp có cùng hàm băm SHA-256, thì chúng giống hệt nhau. Điều tương tự cũng xảy ra với SHA-512. (Có khả năng về mặt lý thuyết là chúng có thể khác nhau, nhưng xác suất xảy ra tình cờ này ít hơn nhiều so với xác suất máy tính của bạn bị lật một chút trong quá trình xác minh so với việc nó không liên quan. cùng một hàm băm, không ai biết cách làm điều này cho SHA-256 hoặc SHA-512.)

Nếu hai tệp Excel có giá trị băm khác nhau, thì chúng khác nhau, nhưng không có cách nào để biết chúng khác nhau bao nhiêu. Chúng có thể có dữ liệu giống hệt nhau nhưng định dạng khác nhau hoặc chúng chỉ có thể khác nhau trong các thuộc tính hoặc chúng có thể được lưu bởi các phiên bản khác nhau. Trong thực tế nếu Excel là bất cứ thứ gì như Word thì chỉ cần lưu tệp cập nhật siêu dữ liệu của nó. Nếu bạn chỉ muốn so sánh dữ liệu số và văn bản và bỏ qua định dạng và thuộc tính, bạn có thể xuất bảng tính sang CSV để so sánh chúng.

Nếu bạn có sẵn các công cụ Unix / Linux, thì bạn có thể sử dụng cmpđể so sánh hai tệp. Để so sánh hai tệp trên cùng một máy, tổng kiểm tra chỉ làm cho mọi thứ phức tạp hơn.


Nếu hai tệp có cùng hàm băm MD5 và cả hai đều không được chế tạo đặc biệt, thì chúng giống hệt nhau. Điều đó là không chính xác. Có vô số tin nhắn có thể, nhưng chỉ có 2 ^ 64 băm 64 bit có thể. Nó được gọi là "nguyên tắc pigeonhole" : "nguyên tắc pigeonhole nói rằng nếu ncác vật phẩm được đưa vào mcontainer, n > mthì, ít nhất một container phải chứa nhiều hơn một vật phẩm." Nếu bạn tạo nhiều hơn 2 ^ 64 tin nhắn, bạn sẽ có va chạm mà không có bất kỳ "chế tạo đặc biệt" nào. Và bạn có thể chỉ với 2.
Andrew Henle

@AndrewHenle, MD5 không phải là 64 bit, là 128. Nếu tạo ra một vụ va chạm vô tình khiến chúng ta rơi vào thời gian chết chóc của vũ trụ, thì "chỉ có thể" đối với một định nghĩa cực kỳ hàn lâm (do đó vô dụng).
Charles Duffy

@CharlesDuffy Bạn đang giả sử băm được phân phối ngẫu nhiên. Không phải vậy.
Andrew Henle

Có hiệu quả tương đương với phân phối ngẫu nhiên là một phần của định nghĩa về yếu tố cấu thành một hàm băm mật mã tốt - bạn có rất nhiều vòng trộn vì một lý do. Chắc chắn, có các thuật toán băm yếu, nhưng tập trung vào những điểm yếu đó đưa chúng ta vào những cảnh báo đã nêu trước đây xung quanh các cuộc tấn công có chủ ý. (Hoặc là bạn nói rằng MD5 đã được chứng minh là chỉ có 64 bit có hiệu quả ngẫu nhiên, tôi sẽ thừa nhận rằng tôi đã không được giữ, vì vậy đó là chính đáng - liên kết xin vui lòng?)
Charles Duffy

@AndrewHenle Tôi không nói rằng một vụ va chạm là không thể về mặt toán học, điều này sẽ sai, nhưng không liên quan ở đây. Tôi nói rằng nó đã không xảy ra, đó là sự thật. Nhận xét của bạn không chính xác theo cách thay đổi hoàn toàn thỏa thuận. Có 2 ^ 128 băm MD5 có thể, không phải 2 ^ 64. Điều này có nghĩa là bạn sẽ cần phải tạo 2 ^ 128 băm để chắc chắn tạo ra xung đột. Trên thực tế, theo nghịch lý sinh nhật, 2 ^ 64 sẽ mang đến cho bạn cơ hội vĩ mô về sự va chạm giữa các hàm băm bạn tạo ra (không phải với hàm băm được tạo trước đó). Nhưng đây là moot vì chúng ta biết làm thế nào để va chạm.
Gilles 'SO- ngừng trở nên xấu xa'

6

Trả lời ngắn gọn: Một băm mật mã được cho là để giúp bạn có một cách hợp lý tự tin rằng tập tin với băm phù hợp đều giống nhau. Trừ khi cố tình tạo ra, khả năng hai tệp hơi khác nhau có giá trị băm tương tự là rất nhỏ. Nhưng khi so sánh và xác minh các tệp có thể bị giả mạo một cách có chủ ý, MD5 là lựa chọn kém. (Sử dụng hàm băm khác như SHA3 hoặc BLAKE2.)

Câu trả lời dài: Hàm băm lý tưởng là hàm tạo ra hàm băm mật mã gần như duy nhất cho mỗi phần dữ liệu duy nhất. Nói cách khác, chúng tôi chắc chắn biết rằng có hai tệp trong vũ trụ này có giá trị băm va chạm với nhau, khả năng hai tệp này tự nhiên kết hợp với nhau là rất nhỏ.

Mười năm trước, tôi quyết định tôi phải ở xa MD5 nhất có thể. (Tất nhiên, cho đến ngày hôm qua, tôi đã nhớ ra lý do sai lầm khi làm như vậy; mười năm là một thời gian dài, bạn thấy. Tôi đã xem lại các bản ghi nhớ trong quá khứ của mình để nhớ tại sao và chỉnh sửa câu trả lời này.) Bạn thấy, vào năm 1996, MD5 đã được tìm thấy dễ bị tấn công va chạm. 9 năm sau, các nhà nghiên cứu đã có thể tạo các cặp tài liệu PostScript và (ouch!) X.509 với cùng hàm băm! MD5 đã bị phá vỡ rõ ràng. (Megaupload.com cũng đang sử dụng MD5 và có rất nhiều sự hỗn loạn xung quanh các va chạm băm khiến tôi gặp rắc rối vào thời điểm đó.)

Vì vậy, tôi đã kết luận rằng trong khi MD5 là (và vẫn còn) đáng tin cậy để so sánh các tệp lành tính, thì người ta phải ngừng sử dụng nó hoàn toàn. Tôi cho rằng việc phụ thuộc vào nó có nguy cơ biến thành sự nuông chiều và sự tự tin sai lầm: Một khi bạn bắt đầu so sánh các tệp bằng cách sử dụng băm MD5 của chúng, một ngày nào đó bạn quên mất dấu hiệu bảo mật và so sánh hai tệp được tạo ra có cùng hàm băm. Ngoài ra, CPU và bộ xử lý mật mã không có khả năng thêm hỗ trợ cho nó.

Tuy nhiên, áp phích ban đầu thậm chí có ít lý do hơn để sử dụng MD5, bởi vì:

  1. Miễn là một người chỉ so sánh hai tệp, so sánh byte theo byte thực sự nhanh hơn so với việc tạo băm MD5 của chính mình. Để so sánh ba hoặc nhiều tệp ... tốt, bây giờ bạn có một lý do chính đáng.
  2. OP đã chỉ định "các cách để xem lại điều này và không cần cài đặt một loạt các plugin". Lệnh Get-FileHash của Windows PowerShell có thể tạo băm SHA1, SHA256, SHA384, SHA512 và MD5. Trên các máy tính hiện đại có hỗ trợ phần cứng cho các hàm băm SHA, việc tạo chúng nhanh hơn.

6
Bạn có thể tạo hàm băm mật mã của riêng mình với bất kỳ độ dài nào bạn chọn, đúng; nhưng sau đó nó có một chiều dài cố định và nguyên tắc pigeonhole vẫn được áp dụng. Câu trả lời chung là: "chỉ bằng cách so sánh các giá trị băm của chúng, bạn không thể chắc chắn hai tệp giống hệt nhau".
Kamil Maciorowski

2
@KamilMaciorowski Về lý thuyết, vâng tôi có thể. Hàm băm tùy chỉnh của tôi có thể chỉ cần tạo một bản sao của tệp lớn nhất. Nhưng tôi không có hứng thú thảo luận về vấn đề này hơn nữa; sự thật là, bạn đã từ chối vì một lý do gây ra tình trạng nitrat chỉ để chứng minh rằng bạn thông minh hơn và nó phản tác dụng với bạn. Bây giờ bạn không thể lấy lại phiếu bầu.

Tôi đồng ý với @KamilMaciorowski ... Đây là một trò chơi xác suất ... sử dụng một hàm băm duy nhất, bạn có thể " tự tin một cách hợp lý " rằng các tệp có băm phù hợp là như nhau, nhưng không đảm bảo 100%. Sử dụng các thuật toán tốt hơn hoặc sử dụng nhiều thuật toán có thể cải thiện sự tự tin của bạn - thậm chí so sánh kích thước tệp có thể giúp ... nhưng bạn không bao giờ có thể tự tin 100% mà không kiểm tra từng byte.
Attie

1
@Attie Huh! Đó là những gì tôi có ý nghĩa ban đầu. Cảm ơn. 🙏 Chỉ có tôi không quen thuộc với những cụm từ sang trọng như "bạn có thể tự tin một cách hợp lý". Lấy làm tiếc. Tuy nhiên, đó là lý do tại sao chúng ta có nút chỉnh sửa. Cá nhân tôi sẽ không bao giờ bỏ qua một câu trả lời tốt chỉ vì một từ trong đó là sai. Tôi chỉnh sửa nó.

1
Về "bỏ một câu trả lời hay": xin lưu ý rằng tôi đảm bảo trước tiên nó không phải là một lỗi đánh máy và bạn thực sự có ý đó; sau đó hạ cấp và đồng thời tôi đã phản hồi cho bạn, tiết lộ lý do của tôi với hy vọng câu trả lời của bạn sẽ tốt hơn. Nó đã làm, vì vậy downvote của tôi không còn nữa. Về cơ bản tôi đã nói với bạn những gì tôi nghĩ là sai với câu trả lời của bạn, Attie đã giúp làm rõ, bạn đã cải thiện câu trả lời. Theo quan điểm của tôi, tất cả chúng tôi đều xử lý tình huống này một cách đúng đắn và toàn bộ câu chuyện diễn ra rất tốt. Cảm ơn bạn.
Kamil Maciorowski

5

Tôi có 2 tài liệu excel và tôi muốn kiểm tra xem chúng có giống hệt nhau không, ngoài tên tệp.

Từ góc độ thực tế, trực tiếp so sánh các tệp để tìm hiểu xem chúng khác nhau sẽ nhanh hơn so với tính toán một hàm băm cho mỗi tệp và sau đó so sánh hàm băm đó.

Để tính toán giá trị băm, bạn phải đọc toàn bộ nội dung của cả hai tệp.

Để xác định xem chúng có giống nhau thông qua so sánh trực tiếp hay không, bạn chỉ cần đọc nội dung của cả hai tệp cho đến khi chúng không khớp. Khi bạn tìm thấy sự khác biệt, bạn sẽ biết các tệp không giống nhau và bạn không phải đọc thêm bất kỳ dữ liệu nào từ một trong hai tệp.

Và trước khi thực hiện, bạn chỉ cần so sánh kích thước của hai tệp. nếu kích thước khác nhau thì nội dung không thể giống nhau.


Khi sử dụng hai tệp trên một ổ đĩa vật lý, sử dụng hàm băm có thể theo kịp tốc độ I / O trên mỗi tệp riêng biệt có thể nhanh hơn một chút so với so sánh các tệp, vì sẽ không cần phải chuyển đổi giữa việc đọc hai tệp. Tuy nhiên, vị trí băm thực sự tỏa sáng là khi cố gắng so sánh liên quan đến nhiều tệp quá lớn để phù hợp với bộ nhớ. Ngay cả khi bạn chỉ muốn tìm hiểu xem tất cả chúng có khớp hay không, so sánh tệp 1 với tệp 2, sau đó tệp 1 với tệp 3, sau đó tệp 1 đến tệp 4, v.v. có thể chậm gần gấp đôi so với tính toán tất cả các giá trị băm của chúng.
supercat

@supercat Nếu các tệp được đọc trong các khối lớn hơn MB hoặc hơn, thì việc chuyển đổi giữa các tệp sẽ không được chú ý. Và nếu một luồng công việc liên quan đến việc so sánh một loạt các tệp để tìm các bản sao, thì hàm băm cũng có thể được tính toán khi mỗi tệp được viết - vì thực hiện nó sau đó có thể được thực hiện miễn phí.
Andrew Henle

Nếu một người có đủ không gian để đệm các khối lớn của các tệp, thời gian chuyển đổi không cần phải là một vấn đề, nhưng nếu không thì chúng có thể. Đối với việc tính toán các giá trị băm khi các tệp được viết, điều đó có thể ổn nếu người ta có thể đảm bảo rằng các tệp không thể được sửa đổi mà không thay đổi hoặc ít nhất là vô hiệu hóa các giá trị băm được lưu trữ. Nếu một người đang cố gắng tránh sao lưu các tệp một cách dư thừa, chỉ nhìn vào các giá trị băm được lưu trữ có thể khiến người ta sao lưu một tệp vô tình bị hỏng nhưng không bận tâm sao lưu các tệp không bị hỏng mà tệp bị hỏng sẽ khớp nhưng không .
supercat

"Một khi bạn tìm thấy sự khác biệt, bạn sẽ biết các tệp không giống nhau" - không nhất thiết phải như vậy. Các tệp XLSX là các tệp ZIP có khả năng lưu trữ nội dung theo các thứ tự khác nhau vẫn có cùng một nội dung. Nhưng ngay cả khi bạn giải nén chúng và so sánh từng tệp riêng lẻ, tệp XLSX chứa các tài liệu XML có thể có các kết thúc dòng khác nhau mà không ảnh hưởng đến nội dung.
Thomas Weller

5

Các giá trị băm như MD5 hoặc SHA có độ dài cố định, giả sử đó là 300 ký tự chữ và số (trong thực tế chúng ngắn hơn và không sử dụng toàn bộ bộ ký tự chữ và số).

Hãy nói rằng các tệp được tạo từ các ký tự chữ và số và kích thước tối đa 2 GB.

Bạn có thể dễ dàng thấy rằng có nhiều tệp hơn (với kích thước lên tới 2GB) so với các giá trị băm có thể. Nguyên tắc pigeonhole nói rằng một số tệp (khác nhau) phải có cùng giá trị băm.

Ngoài ra, như đã trình bày trên shatter.io 1, bạn có thể có hai tệp khác nhau: shatter.io/static/shatter-1.pdf và shatter.io/static/shatter-2.pdf có cùng giá trị băm SHA-1 trong khi hoàn toàn khác nhau

1 SHA1 là thuật toán băm "mạnh" hơn md5


Xác suất va chạm vô tình là quá thấp để tính đến. Nguy cơ va chạm có chủ ý cũng tồn tại đối với MD5 và tệ hơn so với SHA-1 không liên quan khủng khiếp ở đây.
Gilles 'SO- ngừng trở nên xấu xa'

4

KHÔNG. Các giá trị khác nhau đảm bảo các tập tin là khác nhau. Các giá trị giống nhau không đảm bảo các tệp giống nhau. Nó là tương đối dễ dàng để tìm thấy các ví dụ sử dụng CRC16.

Về sự cân bằng của xác suất với các kế hoạch băm đương đại, chúng giống nhau.


1
Câu hỏi là về MD5, không có nguy cơ va chạm do tai nạn. Nó có nguy cơ va chạm có chủ ý, nhưng đó không phải là vấn đề xác suất.
Gilles 'SO- ngừng trở nên xấu xa'

1
Đó cũng là về bảng tính excel với các tên khác nhau, chúng có thể lớn đến mức nào mà một byte để so sánh byte có thể là một tùy chọn? Hai kế hoạch băm với nhau sẽ cung cấp sự chắc chắn.
mckenzm

2
@Gilles Tất cả các mã băm có nguy cơ va chạm ngẫu nhiên, theo định nghĩa. Cách duy nhất để thoát khỏi điều đó là sử dụng toàn bộ tệp làm mã băm. Nhận xét của bạn không có ý nghĩa.
dùng207421

3

Tuy nhiên, câu hỏi của bạn là ngược - giả sử rằng hàm băm có nghĩa là chúng có cùng dữ liệu (không được đảm bảo 100%, nhưng đủ tốt để cả đời so sánh các tệp mỗi giây để không bị va chạm). Không nhất thiết phải tuân theo việc có cùng một dữ liệu có nghĩa là họ sẽ có cùng một hàm băm. Vì vậy, không - bạn không thể so sánh dữ liệu trong tệp excel với dữ liệu trong tệp excel khác bằng cách băm tệp vì có nhiều cách mà hai tệp có thể khác nhau mà không có dữ liệu cơ bản khác nhau. Một cách rõ ràng - dữ liệu được lưu trữ dưới dạng XML, mỗi ô có nút XML riêng. Nếu các nút đó được lưu trữ theo các thứ tự khác nhau thì dữ liệu là như nhau nhưng tệp thì khác.


3

Để thêm vào các câu trả lời khác, đây là nhiều ví dụ về các cặp tệp có cùng hàm băm MD5 và nội dung khác nhau.


Khá là một câu trả lời chỉ liên kết, nhưng thú vị.
Thomas Weller

2

Câu trả lời cho OP này đã được đưa ra nhưng có thể được hưởng lợi từ một bản tóm tắt.

Nếu bạn muốn kiểm tra xem hai tệp có giống nhau hay không, rất nhiều tùy thuộc vào việc các tệp và giá trị băm có nằm trong tầm kiểm soát của bạn hay không.

Nếu bạn tự tạo băm từ các tệp và bạn chắc chắn rằng không ai khác có cơ hội / kỹ năng / động lực để cố tình thử và khiến bạn đưa ra kết luận sai, thì hầu như mọi băm - thậm chí là băm "đã biết" như MD5 và SHA1 gần như chắc chắn là đủ Nhưng điều đó, ý tôi là bạn có thể tạo các tệp ở tốc độ cao trong hàng triệu năm và bạn vẫn khó có thể kết thúc với bất kỳ hai tệp nào thực sự khác nhau nhưng có cùng hàm băm. Nó gần như chắc chắn an toàn.

Đây là kịch bản bạn có, khi bạn muốn kiểm tra nhanh xem hai thư mục trên PC hoặc máy chủ tệp của bạn có cùng một nội dung hay không, nếu bất kỳ tệp nào trong thư mục là trùng lặp chính xác, v.v. và bạn chắc chắn rằng các tệp không có đã được thiết kế / sửa đổi bất hợp pháp và bạn tin tưởng ứng dụng / tiện ích băm của mình để đưa ra kết quả chính xác.

Nếu bạn đang ở trong một tình huống trong đó một trong các tệp - hoặc hàm băm được tính toán trước - có thể đã bị thao túng hoặc thiết kế để đánh lừa bạn một kết luận sai, thì bạn cần hàm băm mạnh hơn (không bị phá vỡ) và / hoặc bảo mật khác. Ví dụ: nếu bạn tải xuống một tệp và kiểm tra xem nó có hợp lệ không bằng cách kiểm tra hàm băm, thì kẻ tấn công có thể tạo ra một tệp xấu với hàm băm chính xác hoặc tấn công trang web để đặt băm không chính xác khi bạn tìm "đúng" " (gia trị được ki vọng. Điều này dẫn đến các vấn đề bảo mật rộng hơn.


2

Trên dòng lệnh Windows, bạn có thể sử dụng comptiện ích để xác định xem hai tệp có giống nhau không. Ví dụ:

comp fileone.xls filetwo.xls

1

Khi các giá trị băm giống hệt nhau, điều này có nghĩa là nội dung tệp là 1: 1 giống nhau không?

Không. Nếu các giá trị băm khác nhau, điều đó có nghĩa là nội dung khác nhau. Mã băm bằng nhau không ngụ ý nội dung bằng nhau. Theo định nghĩa, mã băm là việc giảm một miền lớn xuống phạm vi nhỏ hơn, theo định nghĩa: hàm ý là các mã có nội dung không bằng nhau có thể bằng nhau. Nếu không sẽ không có điểm trong tính toán chúng.


Nếu không sẽ không có điểm trong tính toán chúng. Nếu bạn đã phá vỡ các định luật toán học và phát minh ra một hàm nén không mất dữ liệu có thể nén dữ liệu ngẫu nhiên, vi phạm nguyên tắc pigeonhole, sẽ rất có giá trị khi sử dụng nó! Sẽ rất thuận tiện nếu hàm băm 128 bit thể hiện duy nhất toàn bộ nội dung của tệp. Ngay cả khi không có chức năng giải nén để biến hàm băm trở lại tệp, thì hàm băm không va chạm không thể toán học sẽ rất tốt, ví dụ như tăng tốc độ tìm kiếm song song trong dữ liệu không tin cậy như trong ảnh VM.
Peter Cordes

"Nếu các giá trị băm khác nhau, điều đó có nghĩa là nội dung khác nhau." Không cần thiết. Các tệp XLSX là các tệp ZIP và có thể có cùng một nội dung được lưu trữ theo thứ tự tệp khác nhau.
Thomas Weller

1

Câu trả lời này được dự định là một bản đồ tiện dụng của các tình huống có thể hoặc không thể xảy ra, và lý do bạn có thể áp dụng. Tham khảo các câu trả lời khác để tìm hiểu lý do tại sao các hàm băm hoạt động theo cách này.


Sau khi bạn chọn hàm băm và bám vào nó, đây là tất cả các kết hợp để xem xét:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

Kịch bản trong đó các tệp giống hệt nhau tạo ra các giá trị băm khác nhau là kịch bản duy nhất hoàn toàn không thể.


Hai lý do luôn được áp dụng:

  • Nếu các tệp là giống nhau thì giá trị băm là giống hệt nhau chắc chắn .
  • Nếu giá trị băm là khác nhau thì chắc chắn các tệp khác nhau .

Hai lý do không nghiêm ngặt :

  • Nếu các tệp khác nhau thì giá trị băm có thể khác nhau.
  • Nếu giá trị băm là giống hệt nhau thì các tập tin có thể giống hệt nhau.

0

Đối với mục đích của bạn, có, băm giống hệt nhau có nghĩa là các tệp giống hệt nhau.

Vì các câu trả lời khác đã rõ ràng, có thể xây dựng 2 tệp khác nhau dẫn đến cùng một hàm băm và MD5 không đặc biệt mạnh về vấn đề này.

Vì vậy, sử dụng thuật toán băm mạnh hơn nếu bạn có kế hoạch so sánh một số lượng lớn tài liệu excel hoặc nếu bạn nghĩ ai đó có thể muốn thao tác so sánh. SHA1 tốt hơn MD5. SHA256 tốt hơn một lần nữa và sẽ giúp bạn hoàn toàn tự tin cho việc sử dụng cụ thể của mình.


-1

Các tập tin có thể giống hệt nhau nếu băm của chúng là giống hệt nhau. Bạn có thể tăng độ tin cậy bằng cách sửa đổi cả hai tệp theo một cách giống hệt nhau (ví dụ: đặt cùng một giá trị trong cùng một ô không sử dụng) sau đó so sánh giá trị băm của các tệp đã sửa đổi. Thật khó để tạo ra một xung đột có chủ ý cho một tệp được thay đổi theo cách không được biết trước.


Điều này sẽ không hoạt động do dữ liệu bổ sung được lưu trữ trong các tập tin văn phòng. Bạn cần đặt con trỏ vào cùng một ô trước khi lưu, lưu vào thời điểm chính xác, v.v. Nhưng ngay cả khi đó, các tệp XLSX là các tệp zip bên trong, do đó, nếu thuật toán đó lưu trữ các tệp riêng lẻ theo một thứ tự khác (cho bất kỳ mục đích nào), tệp này giống hệt nhau nhưng hàm băm không
Thomas Weller

-2

Hãy xem xét điều này một cách thực tế. Thay vì nói "băm giống hệt nhau" tôi sẽ nói "Tôi đã viết một chương trình máy tính tính toán băm của hai tệp và in ra chúng có giống nhau hay không", và tôi chạy chương trình với hai tệp, và nó nói "Giống hệt". Có một số lý do tại sao nó có thể làm điều đó:

Các tập tin có thể giống hệt nhau. Mã của tôi có thể có lỗi (một lỗi thực tế đã xảy ra trong thực tế là so sánh hai hàm băm dài (256 byte) không phải với memcmp nhưng với strcmp: So sánh sẽ trả về "giống nhau" nếu byte đầu tiên trong mỗi hàm băm là 0 và cơ hội cho đó là 1 trong 65536. Có thể có lỗi phần cứng (tia vũ trụ chạm vào một ô nhớ và chuyển đổi nó). Hoặc bạn có thể gặp trường hợp hiếm gặp của hai tệp khác nhau có hàm băm giống hệt nhau (va chạm băm).

Tôi có thể nói rằng đối với các tệp không giống nhau, cho đến nay nguyên nhân rất có thể là do lỗi lập trình viên, sau đó là tia vũ trụ đã thay đổi biến boolean với kết quả so sánh các giá trị băm từ "false" thành "true" và sau đó sẽ xuất hiện nhiều hơn sự trùng hợp của một vụ va chạm băm.

Có các hệ thống sao lưu doanh nghiệp tránh sao lưu các tệp giống hệt nhau từ 10.000 người dùng bằng cách băm từng tệp và kiểm tra tệp có hàm băm giống hệt đã được lưu trữ trên máy chủ. Vì vậy, trong trường hợp va chạm, một tệp sẽ không được sao lưu, có thể dẫn đến mất dữ liệu. Ai đó đã tính toán rằng nhiều khả năng một thiên thạch va vào máy chủ của bạn và phá hủy tất cả các bản sao lưu hơn là mất một tệp vì tổng kiểm tra của nó khớp với một tệp khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.