2009-08-18 10 views
17

PHP ma funkcję uniqid(), która generuje identyfikatory UUID.Dlaczego MD5'ing UUID nie jest dobrym pomysłem?

W przykładach użytkowania, pokazuje następujący:

$token = md5(uniqid());

Ale w komentarzach, someone says this:

Generowanie MD5 z unikalnym ID jest naiwny i zmniejsza znacznie od wartość unikalnych identyfikatorów, a także zapewnienie znaczącego (możliwego do zaatakowania) ograniczenia na domenie MD5 w domenie . To jest głęboko zepsuta rzecz. Prawidłowe podejście polega na użyciu unikalnego identyfikatora na własnym komputerze; jest już przystosowany do braku kolizji .

Dlaczego to prawda, jeśli tak? Jeśli skrót MD5 jest (prawie) unikalny dla unikalnego identyfikatora, to co jest nie tak z md5'ing z uniqid?

Odpowiedz

33

Identyfikator UUID ma szerokość 128 bitów i cechuje go wyjątkowość w sposobie jego generowania. Wartość mieszania MD5 ma szerokość 128 bitów i nie gwarantuje unikalności, a jedynie prawdopodobieństwo wystąpienia kolizji. Skrót MD5 nie jest mniejszy niż UUID, więc nie pomaga w przechowywaniu.

Jeśli wiesz, że hash pochodzi z UUID, znacznie łatwiej jest zaatakować, ponieważ domena ważnych UUID jest właściwie przewidywalna, jeśli wiesz coś o maszynie, która je generuje.

Jeśli potrzebujesz dostarczać tokena to musisz użyć cryptographically secure random number generator. (1) Identyfikatory UUID nie są zaprojektowane do ochrony kryptograficznej, gwarantowane tylko jako unikalne. Monotonicznie rosnąca sekwencja ograniczona unikatowymi identyfikatorami maszyn (zazwyczaj MAC) i czasem wciąż jest doskonale poprawnym UUID, ale wysoce przewidywalna, jeśli można odwrócić inżynierię jednego UUID z sekwencji tokenów.

  1. Cechą charakterystyczną zaszyfrowanych PRNG jest, że wynik danej iteracji nie zawiera wystarczających informacji, aby wywnioskować wartość następnej iteracji - czyli jest jakaś ukryta stan w generatorze, który nie objawia się w numer i nie można go wywnioskować, badając sekwencję liczb z PRNG.

    Jeśli zajmiesz się teorią liczb, możesz znaleźć sposoby na odgadnięcie wewnętrznego stanu niektórych PRNG z sekwencji wygenerowanych wartości. Mersenne Twister jest przykładem takiego generatora. Ma ukryty stan, którego używał, aby uzyskać długi okres, ale nie jest bezpieczny pod kryptografią - możesz wziąć dość małą sekwencję liczb i użyć jej do wywnioskowania stanu wewnętrznego. Kiedy już to zrobisz, możesz użyć go do zaatakowania mechanizmu kryptograficznego, który zależy od zachowania tej sekwencji w tajemnicy.
4

MD5ing UUID nie ma sensu, ponieważ identyfikatory UUID są już unikalne i mają ustaloną długość (krótkie), właściwości, które są jednym z powodów, dla których ludzie często używają MD5. Więc przypuszczam, że zależy to od tego, co planujesz zrobić z UUID, ale ogólnie UUID ma te same właściwości, co niektóre dane, które zostały MD5'd, więc dlaczego oba?

+1

W rzeczywistości jest gorzej, ponieważ identyfikatory UUID są unikalne, podczas gdy skróty MD5 identyfikatorów UUID nie są. –

2

Identyfikatory UUID są już unikatowe, więc nie ma sensu ich używać.

Odnosząc się do pytania bezpieczeństwa, możesz zostać zaatakowany, jeśli atakujący może przewidzieć, jaki będzie następny unikatowy identyfikator.Jeśli wiadomo, że generujesz unikalne identyfikatory z identyfikatorów UUID, zestaw potencjalnych następnych unikalnych identyfikatorów jest znacznie mniejszy, co daje większą szansę na brutalny atak sił.

Jest to szczególnie ważne, jeśli osoba atakująca może uzyskać od Ciebie cały szereg unikalnych identyfikatorów i w ten sposób odgadnąć schemat generowania identyfikatorów UUID.

+0

"nie ma sensu": w rzeczywistości jest gorzej niż bez sensu, ponieważ identyfikatory UUID są unikalne, natomiast skróty MD5 identyfikatorów UUID nie są. –

2

Version 3 z identyfikatorów UUID są już w wersji MD5, więc nie ma sensu robić tego ponownie. Jednak nie jestem pewien, jakiej wersji używa PHP UUID.

12

Zauważ, że uniqid() nie zwraca UUID, ale „unikalny” ciąg w oparciu o aktualny czas:

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

Jeśli to zrobisz kilka razy, otrzymasz bardzo podobne ciągi wyjściowe i każdy kto zna uniqid() rozpozna algorytm źródłowy. W ten sposób łatwo jest przewidzieć kolejne identyfikatory, które zostaną wygenerowane.

Zaletą md5() - ing wyjście, wraz z ciągiem soli specyficznych dla aplikacji lub liczby losowej, jest sposobem trudniej odgadnąć wyrażenie:

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

odróżnieniu od zwykłego uniqid() ta produkuje bardzo różne wyprowadza co każdą mikrosekundę. Co więcej, nie ujawnia on twojego "ciągu soli przedrostka", ani też, że pod maską używasz uniqid(). Bez znajomości soli trudno jest odgadnąć następny dowód tożsamości.

Podsumowując, nie zgodziłbym się z opinią komentatora i zawsze wolałbym mieć wynik md5() niż zwykły uniqid().

+3

Jeśli potrzebujesz identyfikatorów, które są nie do zniesienia, przyjmowanie łatwych do odgadnięcia danych wejściowych i zaciemnianie to _nie_ droga. –

+0

W jaki sposób dane wejściowe są zgadywane, jeśli nie ujawniasz ciągu znaków soli (prefiks używany dla uniqid())? Czy możesz wyjaśnić swoją krytykę? –

+1

Istnieją całkowicie dobre sposoby generowania naprawdę nieprzydatnych identyfikatorów. Po prostu zaciemniając łatwo przewidywaną sekwencję, polegasz na tym, że nikt nie zastanawia się nad metodą i ciągiem soli. Jeśli tak, mogą łatwo przewidzieć identyfikatory, które wygenerujesz w przyszłości. –

0

Na marginesie MD5 jest już przestarzały i nie powinien być używany w niczego wartym ochrony - PHI, PII lub PCI - od 2010 roku. Amerykańscy Feds wzmocnili to, a jakikolwiek podmiot niezgodny z prawem zapłaciłby wiele $$ $ za karę.

+0

Tak. Oprogramowanie, które korzysta z MD5 dla bezpieczeństwa, oficjalnie nie będzie rozpatrywane w 2010 roku, ale realistycznie nikt nie chce tego teraz, ponieważ będą musieli się go pozbyć później (za bardzo późną wartość później). Jeśli więc sprzedajesz oprogramowanie lub oprogramowanie jako usługę, możesz wykluczyć niektórych klientów za pomocą MD5. Użyj SHAx, najlepiej o dużej wartości x. – quillbreaker

+1

O ile mi wiadomo, MD5 nigdy nie było zawarte w standardzie NIST. Tym, co jest wycofywane przez NIST, jest SHA-1 i zasadniczo wszystko, co ma 80-bitowe lub mniej bezpieczeństwa. Również firmy nie wdrażające standardów NIST nie otrzymują mandatu.Po prostu nie mogą uzyskać certyfikatu NIST, a zatem tracą klientów, którzy wymagają takiego certyfikatu. – Accipitridae

Powiązane problemy