2009-08-18 2 views
17

PHP에는 종류의 UUID를 생성하는 uniqid() 함수가 있습니다. 순진 입니다MD5를 UUID로 사용하는 것이 좋은 생각이 아닌 이유는 무엇입니까?

고유 ID에서 MD5를 생성하고 많이 감소 :

$token = md5(uniqid());

그러나 코멘트에

, someone says this : 사용의 예에서

는, 다음을 보여줍니다 값은 고유 ID이며, MD5 도메인에 중요한 (공격 가능) 협약을 제공합니다. 할 수있는 일은 깊이 끼어 들었습니다. . 정확한 접근 방식은 고유 ID를 사용하는 것입니다. 그것은 이미 non-collision을 위해 조정되었습니다.

왜 그렇습니까? MD5 해시가 고유 ID에 대해 거의 유일하다면, uniqid를 md5하는 것이 잘못 되었습니까?

답변

33

UUID는 128 비트 너비이며 고유 한 방식으로 생성됩니다. MD5 해시는 128 비트 폭이며 고유성을 보장하지 않으며 충돌 가능성이 낮습니다. MD5 해시는 UUID보다 작아서 저장에 도움이되지 않습니다.

해시가 UUID에서 왔음을 알고 있다면 유효한 UUID의 도메인이 사실을 예측할 수 있기 때문에 공격하는 것이 훨씬 쉽습니다.

보안 토큰을 제공해야한다면 cryptographically secure random number generator.을 사용해야합니다. (1) UUID는 암호로 보호되고 고유성이 보장되도록 설계되지 않았습니다. 고유 기계 식별자 (일반적으로 MAC)와 시간으로 묶인 단조 증가 시퀀스는 여전히 완벽하게 유효한 UUID이지만 토큰 시퀀스에서 단일 UUID를 리버스 엔지니어링 할 수있는 경우 매우 예측 가능합니다. 에 공개되지 않은 발전기의 일부 숨겨진 상태가 즉 -

  1. 안전한 암호화 PRNG의 특성을 정의는 주어진 반복의 결과는 다음 반복의 값을 추정하기에 충분한 정보를 포함하지 않는다는 것입니다 그 수는 PRNG로부터의 일련의 수들을 조사함으로써 유추 될 수 없다.

    숫자 이론에 도달하면 일련의 생성 된 값으로부터 일부 PRNG의 내부 상태를 추측 할 수있는 방법을 찾을 수 있습니다. Mersenne Twister은 이러한 생성기의 예입니다. 오랜 기간 동안 사용되었지만 암호로 안전하지는 않은 상태가 숨겨져 있습니다. 숫자의 순서를 상당히 줄여 내부 상태를 추측 할 수 있습니다. 이 작업을 완료하면 해당 시퀀스를 비밀로 유지하는 암호 메커니즘을 공격 할 수 있습니다.
4

MD5ing MDU는 UUID가 이미 고유하고 고정 길이 (short)이기 때문에 무의미합니다. MD5는 사람들이 자주 MD5를 사용하여 시작하는 이유 중 일부입니다. 그래서 당신이 UUID로 무엇을 할 계획인지에 달렸지 만, 일반적으로 UUID는 MD5 된 일부 데이터와 동일한 속성을 가지고 있습니다.

+1

실제로 UUID가 고유하기 때문에 UUID의 MD5 해시가 고유하지 않으므로 악화됩니다. –

2

UUID는 이미 고유하므로 MD5로 간주 할 필요가 없습니다.

보안 질문과 관련하여 일반적으로 공격자가 다음 고유 ID를 예측할 수 있다면 공격 할 수 있습니다.UUID에서 고유 ID를 생성하는 것으로 알려진 경우 잠재적 인 다음 고유 ID 세트가 훨씬 적어서 무차별 공격에 대한 더 나은 기회를 제공합니다.

특히 공격자가 전체 ID를 얻을 수 있고 UUID 생성 방식을 추측 할 수있는 경우에 특히 그렇습니다.

+0

"아무런 의미가 없습니다."사실 UUID가 고유하기 때문에 MDU 해시는 UUID가 아니기 때문에 실제로는 아무런 문제가 없습니다. –

2

Version 3의 UUID는 이미 MD5되어 있으므로 다시 할 필요가 없습니다. 그러나, 나는 PHP가 사용하는 UUID 버전을 모르겠습니다. uniqid()UUID하지만, 현재 시간을 기준으로 "독특한"문자열을 반환하지 않습니다

12

하는 것으로 : 여러 번, 당신은 매우 유사한 출력 문자열 모두를 얻을 것이다 할 경우

$ php -r 'echo uniqid("prefix_", true);' 
prefix_4a8aaada61b0f0.86531181 

누가 익숙한 uniqid() 소스 알고리즘을 인식합니다. 그렇게하면 생성 될 다음 ID를 예측하는 것이 매우 쉽습니다. 일반 uniqid() 달리

$ php -r 'echo md5(uniqid("prefix_", true));' 
3dbb5221b203888fc0f41f5ef960f51b 

, 이것은 매우 다른 생산 : -

MD5의 장점은()는 응용 프로그램 특정 소금 문자열이나 임의의 숫자와 함께 출력을 보내고, 문자열을 추측 할 수있는 방법 어렵습니다 모든 마이크로 초를 출력합니다. 또한 "접두어 소금"문자열을 발견하지 못하거나 uniqid()을 사용하고 있지 않습니다. 소금을 알지 못하면 다음 ID를 추측하는 것은 매우 어렵습니다.

요약하면, 저는 의견의 견해에 동의하지 않고 항상 md5() -ed 출력을 보통 uniqid()보다 선호합니다.

+3

ID를 추측 할 필요가없는 경우 쉽게 추측 할 수있는 입력을 가져 와서 난독 화를 시도하지 않아도됩니다. –

+0

salt 문자열 (uniqid()에 사용 된 접두어)을 노출하지 않으면 입력을 어떻게 추측 할 수 있습니까? 비판을 설명해 주시겠습니까? –

+1

정말로 틀린 ID를 생성하는 좋은 방법이 있습니다. 쉽게 예측할 수있는 시퀀스를 난독 화하는 것만으로도 방법과 소금 문자열을 알아내는 사람은 아무도 없습니다. 그렇게하면 미래에 생성 할 ID를 쉽게 예측할 수 있습니다. –

0

MD5는 실제로 폐기되었으며 2010 년 이후에는 PHI, PII 또는 PCI를 보호 할만한 가치가있는 것으로 사용되어서는 안됩니다. 미국 연방 준비 제도 이사회 (Federal Feds)가 이것을 강요했으며 비준수기구는 벌금으로 $$$을 (를) 많이 지불 할 것입니다.

+0

예. 보안을 위해 MD5를 사용하는 소프트웨어는 2010 년을 지나면 공식적으로 고려되지 않지만 현실적으로는 나중에 제거해야하기 때문에 아무도 지금은 필요하지 않습니다. 따라서 소프트웨어 또는 소프트웨어를 서비스로 판매하는 경우 MD5 만 사용하여 일부 고객을 제외하게됩니다. SHAx를 사용하십시오. x 값이 큰 것이 바람직합니다. – quillbreaker

+1

내가 아는 한, MD5는 NIST 표준에 포함되지 못했습니다. NIST에 의해 단계적으로 제거되는 것은 SHA-1과 기본적으로 80 비트 이하의 보안을 가진 모든 것입니다. 또한 NIST 표준을 이행하지 않는 회사는 벌금이 부과되지 않습니다.그들은 NIST 인증을받을 수 없으므로 그러한 인증을 요구하는 고객을 잃게됩니다. – Accipitridae

관련 문제