2012-07-09 10 views
6

Powiel możliwe:
Secure hash and salt for PHP passwordsKorzystanie md5 zabezpieczone nawet jego trudniejszą

widziałem kogoś kodowania hash hasła takiego,

md5(uniqid(mt_rand('password', 15), true)); 

jest to, że sposób zabezpieczony to zrobić? czy to się udało?

+8

W jaki sposób weryfikują hasło po haszowaniu?Również 'mt_rand' przyjmuje ints jako swoje parametry, a nie łańcuchy. –

+1

Ah, @Rocket co za pytanie? !!! – Engineer

+0

Osobiście używam [phpass] (http://www.openwall.com/phpass/). –

Odpowiedz

6

Nie tylko nie jest to bezpieczne, ale nawet nie działa.

mt_rand przyjmuje 2 parametry, wartość minimalną i wartość maksymalną.

mt_rand('password', 15) 

Przekształca 'password' do int (0), a następnie powraca do liczby losowej o wartości pomiędzy 0 i 15.

uniqid(mt_rand('password', 15), true) 

ten następnie generuje unikalny identyfikator, a poprzedza liczbę losową z poprzedniego etapu do niego: obliczenia coś takiego:

144ffb22886d58e1.82100749 

To ciąg jest następnie md5'd.

Jak możesz być w stanie zobaczyć, ten kod jest w 100% bezużyteczny. Oryginalne hasło jest konwertowane na 0 i utracone na zawsze, więc wszystko, co robisz, to mieszanie liczb losowych, co jest bezcelowe. Teraz, gdy masz hasz, nie ma możliwości jego ponownego zweryfikowania. Ponieważ hasło jest konwertowane, cokolwiek użytkownik wprowadzi, nie ma znaczenia.

Tak, nie, ten kod nie jest bezpieczny, nie używaj go.

Osobiście używam phpass library. Jest bezpieczny i prosty w użyciu.

+0

Powiedzmy, że jeśli użyję bez 'mt_rand()' w ten sposób, 'md5 (uniqid ('passwrd', true));' czy to lepiej? – itsme

+0

@itsme: Problem polega na tym, w jaki sposób później sprawdza się hasło? Musisz mieć możliwość wygenerowania tego samego skrótu później, a nie możesz tego zrobić za pomocą 'uniqid'. ['uniqid'] (http://php.net/manual/en/function.uniqid.php) nie jest przeznaczony dla haseł, służy do generowania unikalnych identyfikatorów (takich jak UUID). –

+1

Dlaczego -1? Co jest nie tak z tą odpowiedzią? –

2

Szczerze mówiąc, nie użyłbym nawet md5 jako algorytmu haszującego do przechowywania haseł. Zajrzałbym do używania czegoś takiego jak bcrypt. Nie wiem nawet, jak działa twój przykład, ale w każdym razie, jeśli chcesz go zabezpieczyć, trzymaj się z dala od md5, sha1 na minimalnym poziomie i ucz się na błędach innych i używaj soli.

+0

Myślę, że md5 może być bezpieczne, jeśli użyjesz dobrej soli, ale zgadzam się, że nowsze algorytmy są drogą do zrobienia. –

+1

@Rocket Jeśli użyjesz md5() tylko do zaszyfrowania hasła z solą, to nie jest bezpieczne. – PeeHaa

+0

MD5 został super zoptymalizowany pod względem wydajności, a więc w niektórych przypadkach jest możliwe, aby brutalnie wymusić to, ale nadal bym nie polecam MD5 dla bezpiecznej implementacji hashowania hasłem. – sean

11

Nie, to nie jest bezpieczny sposób. Jest podatny na zakrywanie i, w twoim przykładzie, nie jest powtarzalny. Będziesz musiał przechowywać losową wartość z samym hashem. Jeśli th DB jest zagrożony, to staje się niezwykle proste do bruteforce mieszania.

Powinieneś wiedzieć, że MD5 i SHA1 to dwa najsłabsze algorytmy haszowania dostępne w PHP.

Znacznie lepiej jest użyć funkcji crypt(), z CRYPT_BLOWFISH lub PBKDF2.

aktualizacja

Ponadto, jak wspomniano PeeHaa, to nie działa. mt_rand('password', 15) spowoduje Warning: mt_rand() expects parameter 1 to be long, string given on line X.

+0

@PeeHaa, cóż, tak, ponieważ nie jest powtarzalny. –