MD5가 충돌을 일으키기 전에 몇 개의 임의 요소가 있습니까?


164

Amazon S3에 이미지 라이브러리가 있습니다. 각 이미지마다 고유 한 파일 이름을 얻기 위해 서버의 소스 URL과 타임 스탬프를 md5로 지정합니다. S3는 하위 디렉토리를 가질 수 없으므로 이러한 모든 이미지를 단일 플랫 폴더에 저장해야합니다.

생성되는 MD5 해시 값의 충돌에 대해 걱정해야합니까?

보너스 : MD5가 생성하는 해시 값에서 충돌을보기 전에 몇 개의 파일을 가질 수 있습니까?



2
문자 그대로의 대답은 두 번째 파일이 첫 번째 파일과 동일한 MD5를 가질 수 있다는 것입니다. 그러나 확률은 매우 작습니다.
Rick James

답변:


308

우연히 충돌하는 두 해시의 확률은 1/2 128 입니다. 340 undecillion decillion 282 366 920 nonillion octillion septillion 938 463 463 sextillion quintillion 374 천조 607,000,000,000,000 431,000,000,000 768,000,000 211,000 456 1.

그러나 모든 해시를 유지하면 생일 역설 덕분에 확률이 약간 높아집니다 . 해시가 다른 해시와 충돌 할 확률이 50 % 일 경우 2 64 해시 가 필요 합니다. 이것은 평균적으로 충돌을 일으키기 위해 100 년 동안 초당 60 억 개의 파일 을 해시해야한다는 것을 의미합니다 .


20
"충돌의 확률은 1 / 2 ^ 64입니다" -무엇? 충돌 가능성은 이미 해시 된 항목 수에 따라 다르며 고정 된 숫자가 아닙니다. 사실, 정확히 동일한의 1 - sPn/s^n경우, s(검색 공간의 크기입니다 2^128이 경우), 그리고 n인 항목의 수는 해시. 아마도 2^6450 % 충돌 가능성을 갖기 위해 MD5 해시에 필요한 대략적인 항목 수입니다.
BlueRaja-대니 Pflughoeft

19
+1 항상 999 조 롤 이상을 계산하는 방법을 알고 싶었 기 때문에 (그리고 네 대답은 유익했습니다)
Kmeixner

7
불행히도, 당신은 여전히 ​​옳지 않습니다. 해시 함수가 실제로 임의라고 가정합니다. 그렇지 않습니다. 이것은 충돌 확률이 높다는 것을 의미합니다.
Jørgen Fogh

22
JørgenFogh : 그리고 모든 물리 법칙도 "올바르지 않습니다". 이러한 수준의 교육은 의미있는 방식으로 답을 바꾸지 않기 때문에 불필요합니다.
Kornel

20
그래서 당신은 기회가 있다고 말하는 것입니다!
vargonian

27

S3는 서브 디렉토리를 가질 수 있습니다. 키 이름에 "/"를 입력하면 별도의 디렉토리에있는 것처럼 파일에 액세스 할 수 있습니다. 이것을 사용하여 S3의 사용자 ID를 기반으로 사용자 파일을 별도의 폴더에 저장합니다.

예 : "mybucket / users / 1234 / somefile.jpg" 파일 시스템의 디렉토리와 정확히 동일하지는 않지만 S3 API에는 거의 동일하게 작동하는 몇 가지 기능이 있습니다. "users / 1234 /"로 시작하는 모든 파일을 나열하도록 요청할 수 있으며 해당 "디렉토리"에있는 모든 파일이 표시됩니다.


7
이것은 실제로 충돌의 가능성에 대한 질문에 대답하지 않기 때문에 내가 생각하는 내용이어야합니다
Ian Clark

18

잠깐만 요 :

md5(filename) + timestamp

또는:

md5(filename + timestamp)

전자의 경우, 당신은 GUID로가는 길의 대부분이며, 나는 그것에 대해 걱정하지 않을 것입니다. 후자 인 경우 Karg의 게시물에서 충돌이 어떻게 발생하는지 확인하십시오.


1
타임 스탬프를 포함시켜 충돌 가능성을 높이는 방법에 대해 자세히 설명하십시오.
Brad Thomas

14
@BradThomas : 그렇지 않습니다. MD5 충돌 위험은 파일 이름 또는 파일 이름 + 타임 스탬프 조합에 관계없이 동일합니다. 그러나 첫 번째 시나리오에서는 MD5 충돌과 타임 스탬프 충돌이 모두 필요합니다.
Vincent Hubert

2
여전히 2 ^ (128 ^ 60) 분당 두 명의 사용자와 충돌 할 가능성이 있습니다. 말 그대로 사용할 수 없습니다.
Berry M.

2
@BradThomas 더 명확하게 : md5(filename) + timestamp전체 충돌을 갖기 위해 정확히 동일한 타임 스탬프에 대해 md5 충돌이 필요하기 때문에 충돌 위험을 크게 줄입니다. md5(filename + timestamp)과 동일한 md5(filename)파일 이름 (임의 뭔가 더 임의성을 추가하는 것은 단지 개인의 MD5 결과를 변경하고 생일 문제가 여전히 모든 MD5 해시에 걸쳐 존재하기 때문에)로 시작하는 임의이라고 가정.
robocat

10

충돌에 대한 대략적인 경험 법칙은 값 범위의 제곱근입니다. MD5 sig의 길이는 아마도 128 비트이므로 2 ^ 64 이미지 이상에서 충돌이 발생할 수 있습니다.


1
아마도 2 ^ 128이 아니라 128 비트를 의미 할 것입니다. :-)
JesperE

5
en.wikipedia.org/wiki/Birthday_Problem 문제에 대한 추가 정보.
Georg Schölly

7

임의의 MD5 충돌은 극히 드물지만 사용자가 파일을 그대로 제공 할 수있는 경우 충돌이 발생하도록 엔지니어링 할 수 있습니다. 즉, 동일한 MD5sum이지만 다른 데이터로 두 개의 파일을 의도적으로 작성할 수 있습니다. 애플리케이션이이 사례를 합리적인 방식으로 처리하거나 SHA-256과 같은 더 강력한 해시를 사용할 수 있는지 확인하십시오.


소금을 사용하면 사용자 엔지니어링 문제를 해결할 수 있습니다.
StackOverflowed

소금이 어떻게 적용되는지에 달려 있습니다. 사용자 제공 데이터의 접두사이거나 HMAC의 핵심이되어야합니다. 그럼에도 불구하고 심층 방어를 연습하는 것이 좋습니다.
bdonlan

SHA256은 256 비트 길이이지만 SHA256을 더 적은 비트로 잘라서 저장하는 키 길이와의 충돌 위험을 줄일 수 있습니다 (예 : SHA256을 사용하지만 128 비트로 자릅니다 (MD5를 사용하는 것보다 안전) 그들은 같은 수의 비트를 가지고 있지만).
robocat

5

충돌로 인해 MD5와 관련하여 널리 알려진 문제가 있었지만, 임의의 데이터 간의 UNINTENTIONAL 충돌은 매우 드 rare니다 . 반면에 파일 이름을 해싱하는 경우 무작위 데이터가 아니며 충돌이 빨리 발생할 것으로 예상됩니다.


taylors 예제에서 내가 가진 유일한 문제는 누군가가 데이터베이스의 복사본을 얻는다면 아마도 무지개 테이블을 사용하여 신용 카드 번호를 알아낼 수 있다는 것입니다.
Sam Saffron

1
신용 카드에 MD5를 사용하지 않더라도 10,000,000 (8 자리 숫자는 가장 작은 길이의 신용 카드)과 9,999,999,999,999,999 (가장 큰 16 자리 숫자) 사이의 모든 유효한 신용 카드 번호의 Rainbow 테이블은 여전히 ​​큽니다. 생성 할 테이블. 그 숫자를 훔치는 쉬운 방법이있을 것입니다.
acrosman

1

그것이 얼마나 가능성이 있는지는 중요하지 않습니다. 것이 가능하다. 처음 두 가지 일 (해당하지는 않지만 가능할 수도 있음)에서 발생할 수 있으므로 처음부터 충돌을 지원해야합니다.


36
물론 1 / 2 ^ 128의 확률로 발생할 수있는 다른 많은 나쁜 일들이있을 수 있습니다. 걱정하기 위해 이것을 고르고 싶지 않을 수도 있습니다.
Will Dean

2
여기서 일어날 수있는 최악의 일은 사진을 얻을 수 있다는 것입니다. 상대적으로 적은 수의 경우 걱정하지 않아도됩니다. 이제 소프트웨어가 항공기 착륙시 자동 조종 장치를 제어하고 있다면 또 다른 이야기입니다.
Jim C

9
당신은 진지 할 수 없습니다. 충돌 가능성을 높이려면 100 년 동안 초당 60 억 개의 파일을 해시해야합니다. 매우 운이 좋지 않더라도 아마도 S3의 전체 용량보다 인간의 수명보다 오래 걸릴 것입니다.
Kornel

12
데이터베이스와 백업이 모두 실패 할 가능성이 수십억 배 더 높습니다. 충돌은 걱정할 가치가 없습니다.
Artelius

5
충돌 방지 시간을 사용하여 벙커를 구축하여 서버를 배치하십시오! 그 성가신 유성은 당신을 때릴 수 있습니다 (매우 가능성은 없지만 가능합니다). 구걸에서 유성 대피소를 지원해야합니다.
polvoazul

1

MD5 충돌은 거의 발생하지 않습니다. 당신이 경우 구조 MD5s을,에 하나의 기회가 구조 충돌이 될 것입니다.


1
다른 답변들 중 다수는 하나 이상의 아이템을 추가 할 때 충돌 가능성에 대해 이야기합니다 . 내 답변은 전체 테이블에 dup이있을 가능성에 대해 이야기하기 때문에 더 유용하다고 생각합니다.
Rick James

1
이것은 MD5와 관련이 없으며 올바르지 않습니다. 9 조의 고양이가 있다면 다른 사람이 같은 고양이를 가질 가능성이 9 조의 1 조 개라고 말합니다. 여기서 중요한 문제는 하나 이상의 값으로 동일한 해시를 얻을 수 있다는 것입니다.
Joonas Alhonen

@JoonasAlhonen-그렇습니다. 그리고 많은 가난한 사람들은 그것을 감당할 수없는 또 다른 복권을 사기위한 변명으로 사용합니다.
Rick James

감사합니다. 이것은 실제로 매우 유용한 통계입니다. 9 조 개의 항목을 삽입 할 때 충돌이 발생했을 가능성이 있습니다. 감사.
Tom P.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.