2011-03-06 14 views
6

powinienem używać if(strcmp(md5($string),$hash)==0) lub if(md5($string)==$hash)Jaki jest najlepszy sposób porównania haszowanych ciągów? (PHP)

+0

Użyj 'strcmp' w niestandardowych funkcjach sortowania. W przypadku "normalnego" użytkowania porównywanie ciągów bezpośrednio jest łatwiejsze i łatwiejsze do odczytania. –

+6

Dla każdego, kto czyta ten wątek, [prawdopodobnie nie powinieneś tego robić ** **] (http://phpsadness.com/sad/47). – ereOn

+1

Jeśli chcesz tylko porównać skróty, użyj '==='. Jeśli naprawdę zależy Ci na bezpieczeństwie i potencjalnych atakach na taktowanie (nawet pomimo drgań sieci), powinieneś rzucić okiem na [to] (https://github.com/delight-im/Faceless/issues/4) lub [to] (https://github.com/delight-im/Faceless/pull/5) dyskusja lub użyj funkcji 'hash_equals()' (PHP 5.6+). – caw

Odpowiedz

0

== wykazano przez innych użytkowników tutaj, aby być bardzo zawodne. Zamiast tego należy użyć strcmp().

Trzecia opcja, jeśli naprawdę chcesz użyć operator porównania, jest użycie === który nie wykonuje typu przymus jakiegokolwiek rodzaju, a więc zachowuje rodzajów i wartości dla celów porównawczych.

+0

Który z nich ma lepszą wydajność? – webnat0

+0

==, ponieważ tylko jedno porównanie jako mój wpis poniżej powiedziało –

+3

@ Da9: ... i brak wywołania funkcji. –

-4

Myślę, że if(md5($string) == $hash) jest lepszy, ponieważ masz tylko jedno porównanie zamiast 2 (stcmp & ==).

md5 generuje tylko ascii-chars, które nie wymagają binarnego bezpiecznego porównania.

+0

Look @MM answer. Po drugie md5 jest przestarzały (udowodnił, że może zostać zhackowany). Użyj sha (lepiej, nie najlepiej). – Symba

+0

Oczywiście powinieneś używać sha over md5. Ale pytający zapytał, z którego powinien skorzystać. Jeśli ktoś zapyta: "Czy chcesz lody truskawkowe lub lody czekoladowe?", Nie możesz odpowiedzieć "Biorę lody waniliowe". Ponadto pytanie nie dotyczy użycia algorytmu mieszającego, ale porównywania wartości. –

+0

Nie mówimy tutaj o lodzie, ale o bezpieczeństwie. Tak więc odpowiedź brzmi: "Nie używaj niczego z tego, co tu zaproponowałeś!". I BTW: Również SHA-1 ** nie może ** być używany dla haseł. – rugk

15

Jeśli porównujesz ciągi, użyj strcmp lub ===. Ludzie wolą ===, ponieważ strcmp może być mylące (zwraca 0 na sukces, wat).

Należy użyć ===, a nie ==. == zamieni oba operandy na liczby całkowite, jeśli można je zinterpretować jako takie, a ponieważ wartość mieszania MD5 nie mieści się w liczbie całkowitej, zostaną one obcięte do około połowy. Dlatego tylko pierwsze połówki haszy muszą być równe. Zobacz http://phpsadness.com/sad/47.

Jeśli mieszania hasła, należy rozważyć użycie powolnego i silnego algorytmu mieszania, takiego jak PBKDF2, a nie MD5.

+4

Wow ... to naprawdę smutne. – BoltClock

20

Powinieneś być bardzo ostrożny przy porównywaniu skrótów bezpośrednio do rzeczy takich jak uwierzytelnianie, ponieważ możesz otworzyć okno do ataku taktowania.

Chociaż brzmi to bardzo sprzecznie z intuicją, powinieneś dokonać pełnego porównania łańcucha, unikając jakichkolwiek optymalizacji (tj. Wychodzenia wcześniej, jeśli postać jest inna).

Oto kilka linków na temat problemu:

A oto kilka pomysłów w celu jej ustalenia:

0

Właściwie należy użyć password_verify na to, a także korzystać ze wszystkich innych password_* funkcje. Są one dostępne w PHP> = 5.5.0.

Jako zabezpieczenie można użyć this polyfill. Obecnie działa z PHP> = 5.3.7.

A jeśli naprawdę nie możesz/nie chcesz tego użyć, nadal jest hash_equals (i inne potrzebne do tego) jako @MM. już powiedziałem.

Powiązane problemy