Có bao nhiêu phần tử ngẫu nhiên trước MD5 tạo ra va chạm?


164

Tôi đã có một thư viện hình ảnh trên Amazon S3. Đối với mỗi hình ảnh, tôi md5 URL nguồn trên máy chủ của mình cộng với dấu thời gian để có được một tên tệp duy nhất. Vì S3 không thể có thư mục con, tôi cần lưu trữ tất cả các hình ảnh này trong một thư mục phẳng duy nhất.

Tôi có cần lo lắng về sự va chạm trong giá trị băm MD5 được tạo ra không?

Phần thưởng: Tôi có thể có bao nhiêu tệp trước khi bắt đầu thấy xung đột trong giá trị băm mà MD5 tạo ra?



2
Câu trả lời theo nghĩa đen là tệp thứ hai có thể có cùng MD5 với tệp thứ nhất. Tuy nhiên, tỷ lệ cược là vô cùng nhỏ.
Rick James

Câu trả lời:


307

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ỷ tỷ 938 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.

Tuy nhiên nếu bạn giữ tất cả các giá trị băm thì xác suất sẽ cao hơn một chút nhờ nghịch lý sinh nhật . Để có một cơ hội 50% của bất kỳ đụng độ băm với bất kỳ băm khác mà bạn cần 2 64 băm. Điều này có nghĩa là để có được một vụ va chạm, trung bình, bạn sẽ cần băm 6 tỷ tệp mỗi giây trong 100 năm .


20
"Xác suất va chạm là 1/2 ^ 64" - là gì? Xác suất va chạm phụ thuộc vào số lượng vật phẩm đã được băm, nó không phải là một con số cố định. Trên thực tế, nó bằng chính xác 1 - sPn/s^n, skích thước của không gian tìm kiếm ( 2^128trong trường hợp này) nlà bao nhiêu và là số lượng mục được băm. Những gì bạn có thể nghĩ đến là 2^64, đó là số lượng vật phẩm gần đúng mà bạn cần băm MD5 để có 50% khả năng va chạm.
BlueRaja - Daniel Pflughoeft

19
+1 vì tôi luôn muốn biết cách vượt qua 999 nghìn tỷ lol (và ồ, câu trả lời của bạn có nhiều thông tin)
Kmeixner

7
Thật không may, bạn vẫn không đúng. Bạn đang giả định rằng hàm băm là thực sự ngẫu nhiên. Không phải vậy. Điều này có nghĩa là xác suất va chạm cao hơn.
Jørgen Fogh

22
JørgenFogh: Và tất cả các định luật vật lý cũng "không đúng". Mức độ giáo dục như vậy là không cần thiết bởi vì nó không thay đổi câu trả lời theo bất kỳ cách có ý nghĩa nào.
Kornel

20
Vì vậy, bạn đang nói có một cơ hội!
vargonia

27

S3 có thể có các thư mục con. Chỉ cần đặt "/" trong tên khóa và bạn có thể truy cập các tệp như thể chúng nằm trong các thư mục riêng biệt. Tôi sử dụng điều này để lưu trữ các tệp người dùng trong các thư mục riêng dựa trên ID người dùng của họ trong S3.

Ví dụ: "mybucket / users / 1234 / somefile.jpg". Nó không hoàn toàn giống như một thư mục trong một hệ thống tệp, nhưng API S3 có một số tính năng cho phép nó hoạt động gần như giống nhau. Tôi có thể yêu cầu nó liệt kê tất cả các tệp bắt đầu bằng "users / 1234 /" và nó sẽ hiển thị cho tôi tất cả các tệp trong "thư mục" đó.


7
Đây phải là một nội dung tôi nghĩ, vì nó không thực sự trả lời câu hỏi về khả năng xảy ra va chạm
Ian Clark

18

Vì vậy, chờ đợi, là nó:

md5(filename) + timestamp

hoặc là:

md5(filename + timestamp)

Nếu trước đây, bạn hầu hết đều hướng đến GUID và tôi sẽ không lo lắng về điều đó. Nếu sau này, hãy xem bài đăng của Karg về cách cuối cùng bạn sẽ gặp phải va chạm.


1
Vui lòng giải thích cách bao gồm dấu thời gian làm tăng cơ hội va chạm
Brad Thomas

14
@BradThomas: Không. Nguy cơ va chạm MD5 là như nhau cho dù đó là trên tên tệp hoặc kết hợp tên tệp + dấu thời gian. Nhưng trong kịch bản đầu tiên, bạn sẽ cần có cả va chạm MD5 và va chạm dấu thời gian.
Vincent Hubert

2
Điều này vẫn để lại cơ hội va chạm 2 ^ (128 ^ 60) với hai người dùng mỗi phút. Nghĩa đen không sử dụng được.
Berry M.

2
@BradThomas Để rõ ràng hơn: md5(filename) + timestampgiảm rủi ro va chạm một cách ồ ạt vì bạn sẽ cần phải có một vụ va chạm md5 cho chính xác cùng một dấu thời gian để có một vụ va chạm tổng thể. md5(filename + timestamp)cũng giống như md5(filename), giả sử rằng tên tệp là ngẫu nhiên để bắt đầu (vì việc thêm ngẫu nhiên vào thứ gì đó ngẫu nhiên chỉ thay đổi kết quả md5 riêng lẻ và vấn đề sinh nhật vẫn tồn tại trên tất cả các băm md5).
robocat

10

Một nguyên tắc cơ bản cho va chạm là căn bậc hai của phạm vi giá trị. MD5 sig của bạn có lẽ dài 128 bit, do đó bạn sẽ có thể thấy các va chạm ở trên và ngoài 2 ^ 64 hình ảnh.


1
Bạn có thể có nghĩa là 128 bit, không phải 2 ^ 128. :-)
JesperE

5
vi.wikipedia.org/wiki/BISS_Pro Hiệu Một số thông tin khác về vấn đề.
Georg Schölly

7

Mặc dù các va chạm MD5 ngẫu nhiên là cực kỳ hiếm, nhưng nếu người dùng của bạn có thể cung cấp các tệp (sẽ được lưu trữ nguyên văn) thì họ có thể thiết kế các va chạm xảy ra. Nghĩa là, họ có thể cố tình tạo hai tệp có cùng MD5sum nhưng dữ liệu khác nhau. Đảm bảo ứng dụng của bạn có thể xử lý trường hợp này một cách hợp lý hoặc có thể sử dụng hàm băm mạnh hơn như SHA-256.


sử dụng muối sẽ giải quyết vấn đề kỹ thuật người dùng, phải không?
StackOverflow

Nó phụ thuộc vào cách áp dụng muối. Nó sẽ cần phải là tiền tố của dữ liệu do người dùng cung cấp, hoặc tốt hơn là chìa khóa cho một HMAC. Có lẽ vẫn là một ý tưởng tốt để thực hành phòng thủ theo chiều sâu.
bdonlan

Lưu ý mặc dù SHA256 dài 256 bit, bạn có thể đánh đổi rủi ro va chạm với độ dài của khóa bạn đang lưu trữ bằng cách cắt SHA256 thành ít bit hơn, ví dụ sử dụng SHA256 nhưng cắt ngắn thành 128 bit (an toàn hơn so với sử dụng MD5 mặc dù chúng có cùng số bit).
robocat

5

Mặc dù đã có các vấn đề được công bố rộng rãi với MD5 do va chạm, các va chạm KHÔNG GIỚI HẠN giữa các dữ liệu ngẫu nhiên là cực kỳ hiếm . Mặt khác, nếu bạn đang băm tên tệp, đó không phải là dữ liệu ngẫu nhiên và tôi sẽ mong đợi sự va chạm nhanh chóng.


Vấn đề duy nhất tôi gặp phải với ví dụ của taylors là nếu ai đó có được một bản sao cơ sở dữ liệu của bạn, họ có thể tìm ra số thẻ tín dụng bằng cách sử dụng bảng cầu vồng ...
Sam Saffron

1
Mặc dù tôi không chọn sử dụng MD5 cho thẻ tín dụng, nhưng bảng Rainbow gồm tất cả các số thẻ tín dụng hợp lệ trong khoảng 10.000.000 (8 chữ số là thẻ tín dụng có độ dài nhỏ nhất tôi từng thấy) và 9,999.999.999.999.999 (số 16 chữ số lớn nhất) vẫn còn lớn bảng để tạo. Có lẽ có nhiều cách dễ dàng hơn để đánh cắp những con số đó.
acrosman

1

Không thực sự quan trọng như thế nào nó có khả năng; điều đó là có thể. Nó có thể xảy ra ở hai điều đầu tiên bạn băm (rất khó xảy ra, nhưng có thể), vì vậy bạn sẽ cần hỗ trợ va chạm ngay từ đầu.


36
Tất nhiên có thể có nhiều điều tồi tệ khác có thể xảy ra với xác suất 1/2 ^ 128. Bạn có thể không muốn lo lắng về điều này.
Will Dean

2
Điều tồi tệ nhất có thể xảy ra ở đây là bạn có thể có được một bức ảnh. Đối với một số lượng tương đối nhỏ, tôi sẽ không lo lắng. Bây giờ nếu phần mềm của bạn đang điều khiển máy bay tự động hạ cánh máy bay, đó là một câu chuyện khác.
Jim C

9
Bạn không thể nghiêm túc. Bạn sẽ cần băm 6 tỷ tệp mỗi giây, mỗi giây trong 100 năm để có cơ hội va chạm tốt. Ngay cả khi bạn rất không may mắn, có lẽ nó sẽ mất nhiều hơn toàn bộ dung lượng của S3 được sử dụng lâu hơn cả đời người.
Kornel

12
Có khả năng hàng tỷ lần cơ sở dữ liệu và các bản sao lưu của nó sẽ thất bại. Va chạm không đáng lo ngại.
Artelius

5
Sử dụng thời gian ngăn ngừa va chạm xây dựng một boongke để đặt máy chủ của bạn! Những thiên thạch phiền phức đó có thể đánh bạn (rất khó xảy ra, nhưng có thể), vì vậy bạn sẽ cần phải hỗ trợ nơi trú ẩn của thiên thạch khỏi sự cầu xin.
polvoazul

1

Va chạm MD5 là cực kỳ khó xảy ra. Nếu bạn có 9 nghìn tỷ MD5, chỉ có một cơ hội trong 9 nghìn tỷ là sẽ có một vụ va chạm.


1
Nhiều câu trả lời khác nói về xác suất va chạm khi thêm một mục nữa. Tôi nghĩ rằng Câu trả lời của tôi hữu ích hơn vì nó nói về khả năng toàn bộ bảng có bản sao.
Rick James

1
Điều này không có gì để làm với MD5 và không chính xác. Nó giống như nói rằng nếu bạn có 9 nghìn tỷ con mèo thì có khả năng 1 trong 9 nghìn tỷ người có một con mèo giống hệt nhau. Vấn đề chính ở đây là bạn có thể nhận được cùng một hàm băm với nhiều hơn một giá trị.
Joonas Alhonen

@JoonasAlhonen - Vâng, đó là sự thật. Và rất nhiều người nghèo sử dụng nó như một cái cớ để mua một vé xổ số khác mà họ không thể mua được.
Rick James

Cảm ơn, đây thực sự là một thống kê rất hữu ích. Tỷ lệ có một vụ va chạm khi chèn 9 nghìn tỷ mặt hàng. Cảm ơn.
Tom P.
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.