MD5 vẫn đủ tốt để xác định các tệp duy nhất?


139

Có phải băm MD5 một tệp vẫn được coi là một phương pháp đủ tốt để xác định duy nhất nó với tất cả các vi phạm thuật toán MD5 và các vấn đề bảo mật, v.v.? Bảo mật không phải là mối quan tâm chính của tôi ở đây, nhưng xác định duy nhất mỗi tệp là.

Có suy nghĩ gì không?


2
Tôi thực sự hiện đang sử dụng nó cho một trong các ứng dụng của mình và theo như tôi biết thì nó đủ tốt để xác định các tệp duy nhất.
Không có sẵn

2
Bạn có thể sẽ tìm thấy câu hỏi này: stackoverflow.com/questions/862346/ trên hữu ích.
sharptooth

Có bao nhiêu tập tin bạn cần xác định? Nó tạo ra 128 bit, vì vậy nếu bạn đang cố gắng xác định vài nghìn tệp thì không sao. Nhưng nếu bạn đang cố gắng để id nhiều hơn thế, bạn có thể va chạm vào nghịch lý / nghịch lý sinh nhật.
Marcin

Chúng sẽ là các tệp hình ảnh, jpg's, png's và gif's. Và vâng tôi nghĩ giới hạn sẽ là vài nghìn ... Nhưng bạn nghĩ có bao nhiêu tập tin sẽ gây rắc rối cho tôi?
Ranhiru Jude Cooray

Câu trả lời:


89

Đúng. MD5 đã bị phá vỡ hoàn toàn từ góc độ bảo mật, nhưng khả năng xảy ra va chạm do tai nạn vẫn rất nhỏ. Chỉ cần chắc chắn rằng các tệp không được tạo bởi người mà bạn không tin tưởng và người có thể có mục đích xấu.


2
@none: Đối với câu hỏi đầu tiên của bạn, xem tại đây . Tôi sợ tôi không hiểu những câu hỏi khác.
Marcelo Cantos

9
@ 0xA3: Cả bạn và tôi đều không biết OP đang đề cập đến những tập tin nào, hoặc sự thỏa hiệp sẽ gây ra bao nhiêu thiệt hại. Nó có thể là bộ sưu tập ảnh trẻ con của họ cho tất cả chúng ta biết. Mục tiêu của tôi là cung cấp sự thật; những gì người khác làm với họ là việc của họ. Cũng xem xét rằng Bruce Schneier khuyên bạn nên ghi lại mật khẩu của bạn; không phải mọi thứ cần được lưu trữ tại Fort Knox. Một số thứ sẽ giữ tốt dưới chậu hoa.
Marcelo Cantos

3
@Marcelo Cantos, tôi nghĩ cái thiếu ở đây là sự khác biệt hoặc giải nén thuật ngữ 'bảo mật'. Rõ ràng mọi người đang giả định 'bảo mật' cho bất kỳ việc sử dụng công việc kiểm tra nào, nhưng danh pháp mà Marcelo có thể có nghĩa là 'trong phòng thí nghiệm'.
hpavc

5
Tôi rất không đồng ý. Một giá trị băm khác nhau nói rằng các tệp là khác nhau. Nhưng đối với một giá trị băm bằng nhau: bạn không thể nói "rất có thể cả hai đều giống nhau" nếu hàm băm giống nhau: bạn chỉ có thể so sánh byte-byte. Một hàm băm có nhiều bậc có độ lớn nhỏ hơn số lượng giá trị khác nhau cho toàn bộ tệp, do đó, có rất nhiều, rất nhiều, rất nhiều va chạm có thể xảy ra cho mỗi giá trị băm. Chỉ khi bạn trong trường hợp sao chép một tệp đã biết (với hàm băm đã biết) thì giá trị băm giống hệt nhau "có thể có nghĩa là" thứ 2 được sao chép chính xác (ngay cả khi đó, nó không chắc chắn 100%, nhưng rất có khả năng).
Olivier Dulac

3
OK, toán học của tôi hút. GUID có khoảng 122 bit entropy và do đó xác suất xảy ra va chạm ở bất cứ đâu trong một tỷ tệp là khoảng 2 ^ (2 * 30 - 122) = 2 ^ -62. Mặc dù con số này cao hơn nhiều so với tính toán ban đầu của tôi, nhưng nó vẫn rất nhỏ với khoảng một phần tư triệu.
Marcelo Cantos

32

Đối với các mục đích thực tế, hàm băm được tạo ra có thể là ngẫu nhiên phù hợp, nhưng về mặt lý thuyết luôn có xác suất xảy ra va chạm, do nguyên tắc Pigeonhole . Có các giá trị băm khác nhau chắc chắn có nghĩa là các tệp khác nhau, nhưng nhận được cùng một hàm băm không nhất thiết có nghĩa là các tệp giống hệt nhau.

Sử dụng hàm băm cho mục đích đó - bất kể bảo mật có phải là vấn đề đáng lo ngại hay không - do đó, luôn luôn chỉ là bước đầu tiên của kiểm tra, đặc biệt là nếu thuật toán băm được biết là dễ dàng tạo ra xung đột. Để tìm ra một cách đáng tin cậy nếu hai tệp có cùng hàm băm khác nhau, bạn sẽ phải so sánh các tệp đó theo từng byte.


16
@Ranhiru. Không. Hàm băm cung cấp cho bạn giá trị 'tóm tắt' (đối với MD5) chỉ dài 16 byte. Để đảm bảo các tệp giống hệt nhau, bạn cần tạo một byte theo byte. Điều này đúng cho dù bạn chọn thuật toán băm nào, luôn có khả năng xảy ra xung đột.
PaulG

6
@Ranhiru. Đọc lại câu trả lời này, nó là cái toàn diện nhất ở đây. Băm có thể được sử dụng như bước đầu tiên, đưa bạn đến 99,99 ^ e% chắc chắn rằng các tệp giống hệt nhau, nhưng nếu bạn muốn chắc chắn 100% , thì bạn sẽ cần phải kiểm tra từng byte theo byte. Điều này đúng cho dù bạn sử dụng MD5, SHA hay bất kỳ thuật toán nào khác.
PaulG

7
Câu trả lời này là sai. Ngăn chặn giả mạo và xác minh tính độc đáo là điều tương tự. Ngoài ra, trong khi băm không đảm bảo tính duy nhất, so sánh thực tế cũng không. Trong thực tế, khả năng băm vô tình va chạm thực sự thấp hơn là xác suất so sánh không thành công do trục trặc trong CPU được tạo ra bởi phát xạ tia gamma mặt trời bình thường. Và đừng quên rằng thường thì nguồn duy nhất của tệp nằm ở phía bên kia của thế giới bên trong một máy chủ web và phần thông tin độc lập duy nhất bạn có cho mục đích so sánh là hàm băm.
Marcelo Cantos

8
@Marcelo. Không có lý do hợp lý rằng sự va chạm vô tình ít có khả năng xảy ra hơn so với lật bit ngẫu nhiên (trong khi thực hiện so sánh byte bằng byte). Bạn vẫn có cơ hội lật bit tương tự khi xây dựng hàm băm (và có thể nói là nhiều hơn vì có nhiều thời gian xử lý hơn). @Thomas nêu lên quan điểm ban đầu để đề xuất rằng không có cách nào đảm bảo để xác định tính duy nhất, mặc dù tác động của các bit lật rất gây tranh cãi. Ước tính bi quan nhất là 1 lần lật mỗi GB / giờ và RAM ECC sẽ loại bỏ ngay cả điều đó.
PaulG

2
"Khả năng băm vô tình va chạm thực sự thấp hơn là xác suất so sánh không thành công do trục trặc trong CPU được tạo ra bởi phát xạ tia gamma mặt trời bình thường" [cần dẫn nguồn]
endolith

20

MD5 sẽ đủ tốt nếu bạn không có đối thủ. Tuy nhiên, ai đó có thể (cố tình) tạo hai tệp riêng biệt băm đến cùng một giá trị (đó gọi là xung đột) và điều này có thể hoặc không thể là một vấn đề, tùy thuộc vào tình huống chính xác của bạn.

Vì việc biết các điểm yếu MD5 đã biết có áp dụng cho một bối cảnh cụ thể hay không là một vấn đề tế nhị, nên không nên sử dụng MD5. Sử dụng hàm băm chống va chạm (SHA-256 hoặc SHA-512) là câu trả lời an toàn. Ngoài ra, sử dụng MD5 là quan hệ công chúng xấu (nếu bạn sử dụng MD5, hãy chuẩn bị để tự biện minh cho mình; trong khi không ai sẽ hỏi bạn về việc sử dụng SHA-256).


2
Câu trả lời này có thể hơi sai lệch nếu người đọc không quá quen thuộc với băm. Không có gì kỳ diệu về SHA ngăn chặn va chạm băm, chúng chỉ có khả năng chống lại các cuộc tấn công va chạm băm hơn . Nếu bạn muốn có nhiều hơn 99.999 ^ e% chắc chắn rằng các tệp giống hệt nhau, bạn vẫn sẽ cần kiểm tra từng byte theo byte.
PaulG

7
Trên thực tế, so sánh byte-byte có thể thất bại do tia vũ trụ lật một bit (ví dụ: biến đổi a return 0;thành a return 1;). Điều này rất khó xảy ra, nhưng nguy cơ va chạm với SHA-256 thậm chí còn nhỏ hơn thế. Về mặt toán học, bạn không thể chắc chắn rằng hai tệp băm với cùng một giá trị là giống nhau, nhưng bạn không thể chắc chắn điều đó bằng cách so sánh chính các tệp đó, miễn là bạn sử dụng máy tính để so sánh. Ý tôi là không có nghĩa là vượt quá 99.999 .... chắc chắn 9% và SHA-256 đã cung cấp nhiều hơn thế.
Thomas Pornin

2
Gì, bạn không sử dụng bộ nhớ ECC? ;). Nhận xét tốt, suy nghĩ rất thú vị.
PaulG

1
Đừng quên chiếc mũ lá thiếc! Nghiêm trọng hơn, làm thế nào để bạn biết những thông tin thực tế về va chạm và bạn đã xác minh điều này theo một cách nào đó?
James P.

@Thomasuckingin Việc lật bit vũ trụ cũng sẽ ảnh hưởng đến phương pháp MD5, vì vậy nó vẫn còn tệ hơn.
endolith

9

Một md5 có thể tạo ra va chạm. Về mặt lý thuyết, mặc dù rất khó xảy ra, một triệu tệp liên tiếp có thể tạo ra cùng một hàm băm. Đừng kiểm tra vận may của bạn và kiểm tra va chạm md5 trước khi lưu trữ giá trị.

Cá nhân tôi thích tạo md5 các chuỗi ngẫu nhiên, giúp giảm chi phí băm các tệp lớn. Khi va chạm được tìm thấy, tôi lặp lại và băm lại với bộ đếm vòng lặp được nối thêm.

Bạn có thể đọc trên nguyên tắc pigeonhole .


6

Tôi sẽ không đề nghị nó. Nếu ứng dụng hoạt động trên hệ thống nhiều người dùng, có thể có người dùng, sẽ có hai tệp có cùng hàm băm md5 (anh ta có thể là kỹ sư và chơi với các tệp đó hoặc chỉ tò mò - chúng có thể dễ dàng tải xuống từ http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , bản thân tôi trong khi viết câu trả lời này đã tải xuống hai mẫu). Một điều nữa là, một số ứng dụng có thể lưu trữ các bản sao như vậy vì bất kỳ lý do gì (tôi không chắc chắn, nếu có bất kỳ ứng dụng nào như vậy nhưng khả năng tồn tại).

Nếu bạn xác định duy nhất các tệp được tạo bởi chương trình của mình, tôi sẽ nói rằng sử dụng MD5 là ổn. Mặt khác, tôi muốn giới thiệu bất kỳ hàm băm nào khác, nơi chưa có va chạm nào được biết đến.


2

Cá nhân tôi nghĩ rằng mọi người sử dụng tổng kiểm tra thô (chọn phương thức của bạn) của các đối tượng khác để hoạt động như các định danh duy nhất quá nhiều khi họ thực sự muốn làm là có các định danh duy nhất. Lấy dấu vân tay một đối tượng cho việc sử dụng này không phải là mục đích và có khả năng đòi hỏi phải suy nghĩ nhiều hơn là sử dụng cơ chế toàn vẹn uuid hoặc tương tự.


0

MD5 đã bị hỏng, thay vào đó bạn có thể sử dụng SHA1 (được triển khai bằng hầu hết các ngôn ngữ)


Đây là một câu trả lời hoàn toàn tốt. MD5 không được chấp nhận cho các trường hợp sử dụng trong Luật và Kế toán ở Châu Âu từ tháng 5 năm 2018 trở đi.
Bert Sinnema

@BertSinnema bạn có thể chỉ cho tôi nguồn xác định hàm băm nào được chấp nhận, v.v.
berezovskyi

@GregSchmit có thể vì OP không quan tâm đến sức mạnh mật mã mỗi se. Tôi hiểu câu hỏi là "Tôi đã sử dụng MD5 trong bối cảnh không bảo mật, tôi có cần dành thời gian để cập nhật mã không?" loại điều. Và trong bối cảnh này, câu trả lời có thể sai và SHA1 đã bị phá vỡ kể từ đó.
berezovskyi

0

Khi băm ngắn (<một vài K?) Chuỗi (hoặc tệp), người ta có thể tạo hai khóa băm md5, một cho chuỗi thực tế và một chuỗi thứ hai để đảo ngược chuỗi được nối với một chuỗi không đối xứng ngắn. Ví dụ: md5 (đảo ngược (chuỗi | | '1010')). Việc thêm chuỗi bổ sung đảm bảo rằng ngay cả các tệp bao gồm một chuỗi các bit giống hệt nhau tạo ra hai khóa khác nhau. Xin hiểu rằng ngay cả trong sơ đồ này, có khả năng về mặt lý thuyết là hai khóa băm giống hệt nhau cho các chuỗi không giống nhau, nhưng xác suất có vẻ rất nhỏ - thứ gì đó theo thứ tự bình phương của xác suất va chạm md5 và tiết kiệm thời gian có thể là đáng kể khi số lượng tập tin đang tăng lên. Đề án phức tạp hơn để tạo chuỗi thứ hai cũng có thể được xem xét,

Để kiểm tra sự va chạm, người ta có thể chạy thử nghiệm này về tính duy nhất của các khóa băm md5 cho tất cả các bit_vector trong db:

chọn md5 (bit_vector), đếm (*), bit_and (bit_vector) từ db với
nhóm bit_vector bởi md5 (bit_vector), bit_vector có bit_and (bit_vector) <> bit_vector


Ý tưởng thông minh. Nếu "kẻ tấn công" tạo một tệp giả mạo có cùng hàm băm md5, nó sẽ không giúp ích gì trừ khi anh ta biết "muối" của bạn và đảo ngược nội dung sẽ tạo ra một hàm băm khác. Sử dụng 2 md5 khóa như thế sẽ giảm tỷ lệ cược rất nhiều. Nếu nó chỉ để ngăn chặn một "cuộc tấn công" bằng cách sử dụng muối trước khi tính toán cục bộ sẽ là đủ.
Wolf5

0

Tôi thích nghĩ về MD5 như một chỉ số xác suất khi lưu trữ một lượng lớn dữ liệu tệp.

Nếu các giá trị băm bằng nhau thì tôi biết tôi phải so sánh các tệp byte theo byte, nhưng điều đó có thể chỉ xảy ra một vài lần vì một lý do sai, nếu không (băm không bằng nhau) Tôi có thể chắc chắn rằng chúng ta đang nói về hai tệp khác nhau .

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.