Hai chuỗi khác nhau có thể tạo ra cùng một mã băm MD5 không?


93

Đối với mỗi tài sản nhị phân của chúng tôi, chúng tôi tạo ra một băm MD5. Điều này được sử dụng để kiểm tra xem một tài sản nhị phân nhất định đã có trong ứng dụng của chúng tôi hay chưa. Nhưng có thể là hai tài sản nhị phân khác nhau tạo ra cùng một băm MD5. Vì vậy, có thể nào hai chuỗi khác nhau tạo ra cùng một băm MD5?

Câu trả lời:


93

Đối với một tập hợp thậm chí hàng tỷ tài sản, khả năng xảy ra va chạm ngẫu nhiên là rất nhỏ - không có gì bạn phải lo lắng. Xem xét nghịch lý ngày sinh , với một tập hợp gồm 2 ^ 64 (hoặc 18.446.744.073.709.551.616), xác suất của một vụ va chạm MD5 trong tập hợp này là 50%. Ở quy mô này, bạn có thể đánh bại Google về dung lượng lưu trữ.

Tuy nhiên, vì hàm băm MD5 đã bị hỏng (nó dễ bị tấn công va chạm ), bất kỳ kẻ tấn công nào được xác định có thể tạo ra 2 nội dung va chạm trong vài giây giá trị sức mạnh của CPU. Vì vậy, nếu bạn muốn sử dụng MD5, hãy đảm bảo rằng những kẻ tấn công như vậy sẽ không ảnh hưởng đến tính bảo mật của ứng dụng của bạn!

Ngoài ra, hãy xem xét các phân nhánh nếu kẻ tấn công có thể giả mạo xung đột với một nội dung hiện có trong cơ sở dữ liệu của bạn. Mặc dù không có cuộc tấn công nào được biết đến như vậy (tấn công preimage ) chống lại MD5 (tính đến năm 2011), nó có thể trở nên khả thi bằng cách mở rộng nghiên cứu hiện tại về các cuộc tấn công va chạm.

Nếu những điều này trở thành một vấn đề, tôi khuyên bạn nên xem xét chuỗi hàm băm SHA-2 (SHA-256, SHA-384 và SHA-512). Nhược điểm là nó hơi chậm hơn và có đầu ra băm dài hơn.


4
'Ngày' là một sự phóng đại quá lớn vào thời điểm này, theo tôi hiểu.
Nick Johnson

1
Đúng, tôi đã cập nhật bài viết của mình. Cuộc tấn công va chạm ngẫu nhiên năm 2004 thực sự rất nhanh. Cuộc tấn công va chạm tiền tố MD5 năm 2007 có thể mất vài ngày - nhưng nhìn chung hữu ích hơn nhiều đối với kẻ tấn công
intgr

2
Xem câu trả lời của Rubens để biết ví dụ làm việc sẽ tạo ra xung đột giữa hai tệp thực thi khác nhau trong vài giờ. :)
Nick Johnson

38

MD5 là một hàm băm - vì vậy có, hai chuỗi khác nhau hoàn toàn có thể tạo mã MD5 xung đột.

Đặc biệt, lưu ý rằng mã MD5 có độ dài cố định nên số lượng mã MD5 có thể có giới hạn. Tuy nhiên, số lượng các chuỗi (có độ dài bất kỳ) chắc chắn là không giới hạn nên theo lôgic thì phải có va chạm.


12

Có, nó là có thể. Đây thực tế là một vấn đề về Sinh nhật . Tuy nhiên, xác suất của hai chuỗi được chọn ngẫu nhiên có cùng một băm MD5 là rất thấp.

Xem điều này và câu hỏi này để biết ví dụ.


1
Xác suất nào? Đó là sự va chạm? Không, đó sẽ là 1, tức là rất cao. ;-)
Konrad Rudolph

Vâng, sự thật. Chắc chắn tồn tại hai chuỗi với cùng một băm MD5.
sharptooth

3
Tôi đã biết đây là vấn đề lỗ chim bồ câu.
Daniel A. White

vấn đề sinh nhật chỉ liên quan đến tình yêu của một vụ va chạm. Để có bằng chứng, bạn phải có một nguyên tắc lỗ pidgeon
jk.

Tôi sẽ bỏ phiếu cho câu trả lời của bạn hai lần nếu tôi có thể. Chúng ta đang nói về xác suất "thấp" đến mức nào?
Alex Spencer

10

Tất nhiên là có: băm MD5 có độ dài hữu hạn, nhưng có vô số các chuỗi ký tự có thể có được băm MD5.


9

Có, có thể hai chuỗi khác nhau có thể tạo ra cùng một mã băm MD5.

Đây là một thử nghiệm đơn giản bằng cách sử dụng thông điệp nhị phân rất giống trong chuỗi hex:

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c6b384c4968b28812b676b49d40c09f8af4ed4cc  -
008ee33a9d58b51cfeb425b0959121c9

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c728d8d93091e9c7b87b43d9e33829379231d7ca  -
008ee33a9d58b51cfeb425b0959121c9

Chúng tạo ra tổng SHA-1 khác nhau, nhưng có cùng giá trị băm MD5. Thứ hai, các dây rất giống nhau, vì vậy rất khó để tìm ra sự khác biệt giữa chúng.

Sự khác biệt có thể được tìm thấy bằng lệnh sau:

$ diff -u <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2 | fold -w2) <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2 | fold -w2)
--- /dev/fd/63  2016-02-05 12:55:04.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:55:04.000000000 +0000
@@ -33,7 +33,7 @@
 af
 bf
 a2
-00
+02
 a8
 28
 4b
@@ -53,7 +53,7 @@
 6d
 a0
 d1
-55
+d5
 5d
 83
 60

Ví dụ về va chạm ở trên được lấy từ Marc Stevens: Va chạm đơn khối cho MD5 , 2012; anh ấy giải thích phương pháp của mình, với mã nguồn ( liên kết thay thế đến bài báo ).


Một thử nghiệm khác:

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
756f3044edf52611a51a8fa7ec8f95e273f21f82  -
cee9a457e790cf20d4bdaa6d69f01e41

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
6d5294e385f50c12745a4d901285ddbffd3842cb  -
cee9a457e790cf20d4bdaa6d69f01e41

Tổng SHA-1 khác nhau, cùng một băm MD5.

Sự khác biệt nằm trong một byte:

$ diff -u <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2) <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2)
--- /dev/fd/63  2016-02-05 12:56:43.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:56:43.000000000 +0000
@@ -19,7 +19,7 @@
 03
 65
 9e
-70
+74
 4f
 85
 34
@@ -41,7 +41,7 @@
 a3
 f4
 15
-5c
+dc
 bb
 86
 07

Ví dụ trên được phỏng theo Tao Xie và Dengguo Feng: Tạo xung đột MD5 chỉ bằng một khối tin nhắn , năm 2010.


Có liên quan:


4

Có, nó là có thể. Nó được gọi là va chạm Hash .

Phải nói rằng, các thuật toán như MD5 được thiết kế để giảm thiểu xác suất va chạm.

Mục nhập Wikipedia về MD5 giải thích một số lỗ hổng trong MD5 mà bạn cần lưu ý.


4

Chỉ để có nhiều thông tin hơn. Từ quan điểm toán học của xem, chức năng Hash không đơn ánh .
Nó có nghĩa là không có mối quan hệ 1 đến 1 (nhưng một chiều) giữa tập hợp bắt đầu và tập hợp kết quả.

Bijection trên wikipedia

CHỈNH SỬA: để tồn tại các hàm băm hoàn chỉnh: nó được gọi là Hàm băm hoàn hảo .


1
Không có hàm băm hoàn hảo khi kích thước đầu ra nhỏ hơn kích thước đầu vào.
Paŭlo Ebermann

3

Vâng, đúng vậy! Va chạm sẽ có một khả năng (mặc dù, rủi ro là rất nhỏ). Nếu không, bạn sẽ có một phương pháp nén khá hiệu quả!

CHỈNH SỬA : Như Konrad Rudolph nói: Một tập hợp đầu vào có khả năng không giới hạn được chuyển đổi thành một tập hợp đầu ra hữu hạn (32 ký tự hex) sẽ dẫn đến vô số va chạm.


3

Như những người khác đã nói, có, có thể có sự va chạm giữa hai đầu vào khác nhau. Tuy nhiên, trong trường hợp sử dụng của bạn, tôi không thấy đó là một vấn đề. Tôi thực sự nghi ngờ rằng bạn sẽ gặp va chạm - Tôi đã sử dụng MD5 để lấy dấu vân tay hàng trăm nghìn tệp hình ảnh của một số định dạng hình ảnh (JPG, bitmap, PNG, raw) ở công việc trước đó và tôi không có va chạm .

Tuy nhiên, nếu bạn đang cố gắng đánh dấu một số loại dữ liệu, có lẽ bạn có thể sử dụng hai thuật toán băm - tỷ lệ một đầu vào dẫn đến kết quả đầu ra giống nhau của hai thuật toán khác nhau là gần như không thể.


1
Trên thực tế, nếu kẻ tấn công có thể tạo ra xung đột với một thuật toán băm, anh ta có thể sử dụng điều này để tạo ra xung đột cho thuật toán thứ hai. Điều này gần đây đã được thảo luận về câu hỏi của tôi tại crypto.stackexchange .
Paŭlo Ebermann

2

Tôi nhận ra điều này là cũ, nhưng tôi nghĩ rằng tôi sẽ đóng góp giải pháp của mình. Có thể có 2 ^ 128 kết hợp băm. Và do đó xác suất 2 ^ 64 của một nghịch lý ngày sinh. Mặc dù giải pháp dưới đây sẽ không loại trừ khả năng xảy ra va chạm, nhưng nó chắc chắn sẽ làm giảm rủi ro rất đáng kể.

2^64 = 18,446,744,073,709,500,000 possible combinations

Những gì tôi đã làm là tôi đặt một vài hàm băm với nhau dựa trên chuỗi đầu vào để có được một chuỗi kết quả dài hơn nhiều mà bạn coi là hàm băm của mình ...

Vì vậy, mã giả của tôi cho điều này là:

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))

Đó là khả năng không xảy ra va chạm thực tế. Nhưng nếu bạn muốn trở nên siêu hoang tưởng và không thể xảy ra, và không gian lưu trữ không phải là một vấn đề (cũng không phải là chu kỳ tính toán) ...

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string)) 
         & Hash(Reverse(SpellOutLengthWithWords(Length(string)))) 
         & Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))

Được rồi, không phải là giải pháp sạch sẽ nhất, nhưng điều này bây giờ giúp bạn chơi nhiều hơn với mức độ hiếm khi xảy ra va chạm. Đến mức tôi có thể cho rằng thuật ngữ này là không thể xảy ra trong mọi ý nghĩa thực tế.

Vì lợi ích của tôi, tôi nghĩ rằng khả năng xảy ra va chạm là không thường xuyên đến mức tôi sẽ coi điều này không phải là "chắc chắn" nhưng rất khó xảy ra vì nó phù hợp với nhu cầu.

Bây giờ các kết hợp có thể tăng lên đáng kể. Mặc dù bạn có thể mất nhiều thời gian để xem điều này có thể mang lại cho bạn bao nhiêu kết hợp, nhưng về lý thuyết, tôi sẽ nói rằng nó mang lại cho bạn nhiều hơn KÝ KẾT so với con số được trích dẫn ở trên

2^64 (or 18,446,744,073,709,551,616) 

Có thể bằng một trăm chữ số hơn hoặc lâu hơn. Mức tối đa lý thuyết mà điều này có thể cung cấp cho bạn sẽ là

Số chuỗi kết quả có thể có:

528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336


1

Tôi nghĩ rằng chúng ta cần phải cẩn thận lựa chọn thuật toán băm theo yêu cầu của mình, vì xung đột băm không hiếm như tôi mong đợi. Gần đây tôi đã tìm thấy một trường hợp xung đột băm rất đơn giản trong dự án của mình. Tôi đang sử dụng trình bao bọc Python của xxhash để băm. Liên kết: https://github.com/ewencp/pyhashxx

s1 = 'mdsAnalysisResult105588'
s2 = 'mdsAlertCompleteResult360224'
pyhashxx.hashxx(s1) # Out: 2535747266
pyhashxx.hashxx(s2) # Out: 2535747266

Nó gây ra một vấn đề rất phức tạp trong bộ nhớ đệm trong hệ thống, sau đó cuối cùng tôi nhận thấy rằng đó là một vụ va chạm băm.

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.