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)
Odpowiedz
==
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.
Który z nich ma lepszą wydajność? – webnat0
==, ponieważ tylko jedno porównanie jako mój wpis poniżej powiedziało –
@ Da9: ... i brak wywołania funkcji. –
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.
Look @MM answer. Po drugie md5 jest przestarzały (udowodnił, że może zostać zhackowany). Użyj sha (lepiej, nie najlepiej). – Symba
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. –
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
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.
Wow ... to naprawdę smutne. – BoltClock
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:
- https://wiki.php.net/rfc/timing_attack
- http://codahale.com/a-lesson-in-timing-attacks/
- http://carlos.bueno.org/2011/10/timing.html
A oto kilka pomysłów w celu jej ustalenia:
- Najszybszy i najprostszy: po prostu użyj
hash_equals()
, jeśli to możliwe, (PHP 5.6 i nowsze). - https://github.com/symfony/polyfill-php56/blob/master/Php56.php (
hash_equals()
polyfill) - https://github.com/zendframework/zend-crypt/blob/master/src/Utils.php (
compareStrings()
)
Jeśli używasz czegoś nowszego niż PHP 5.6 (włącznie) należy użyć timing attack safe string comparison funkcję.
if (hash_equals($expected, $correct)) {
}
(Jeśli jesteś na PHP 5.5 lub starszej, see here for equivalents.)
Naprawdę jedyna prawidłowa odpowiedź. –
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.
- 1. Jaki jest najlepszy sposób porównania Double i Int?
- 2. C# najlepszy sposób porównania dwóch porach dnia
- 3. Jaki jest właściwy sposób inicjowania pustych ciągów w PHP?
- 4. Jaki jest najlepszy sposób tworzenia wyszukiwania whois?
- 5. Jaki jest najlepszy sposób rejestrowania aktywności użytkowników?
- 6. Jaki jest najlepszy sposób na usunięcie elementu tablicy w PHP?
- 7. Jaki jest najlepszy sposób liczenia odsłon w PHP/MySQL?
- 8. Jaki jest najlepszy sposób integracji dispatchera zdarzeń w bibliotece PHP?
- 9. Jaki jest najlepszy sposób dodawania przedziału czasu w PHP?
- 10. Jaki jest najlepszy sposób sprawdzenia, czy URL istnieje w PHP?
- 11. Jaki jest najlepszy sposób debugowania wywołań AJAX do PHP?
- 12. Jaki jest najlepszy sposób przechowywania zmiennych konfiguracyjnych w PHP?
- 13. DateTime.TryParseExact metoda porównania ciągów
- 14. Jaki jest właściwy sposób obsługi ciągów char *?
- 15. Jaki jest najlepszy sposób porównania 2 wariantów zapytania SQL dla wydajności?
- 16. Jaki jest najlepszy sposób porównania 2 drzew folderów w systemie Windows?
- 17. Jaki jest najlepszy sposób uczenia się WCF?
- 18. Jaki jest najlepszy sposób przetestowania aplikacji szyny?
- 19. Jaki jest najlepszy sposób na skopiowanie listy?
- 20. Jaki jest najlepszy sposób zamknięcia gałęzi Mercurial?
- 21. Jaki jest najlepszy sposób przełączania zmiennej binarnej?
- 22. Jaki jest najlepszy sposób przetestowania narzędzia RedirectToAction?
- 23. Jaki jest najlepszy sposób wykonywania jQuery .change()
- 24. Jaki jest najlepszy sposób testowania usług WCF?
- 25. Jaki jest najlepszy sposób wyczyszczenia tablicy łańcuchów?
- 26. Jaki jest najlepszy sposób obsługi wielu działań?
- 27. Jaki jest najlepszy sposób profilowania wykonywania javascript?
- 28. Jaki jest najlepszy sposób tworzenia wewnętrznych produktów?
- 29. Jaki jest najlepszy sposób odczytu GetResponseStream()?
- 30. Jaki jest najlepszy sposób implementacji protokołów?
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. –
Dla każdego, kto czyta ten wątek, [prawdopodobnie nie powinieneś tego robić ** **] (http://phpsadness.com/sad/47). – ereOn
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