Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Losowy ciąg znaków, Dlaczego tak, a nie inaczej?
MacDada
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 1
Dołączył: 24.06.2010
Skąd: Sopot

Ostrzeżenie: (0%)
-----


Hej!

Piszę właśnie mechanizm logowania. Po przeczytaniu wielu wątków na tym forum i pogoogle'owaniu tematu postanowiłem „posolić” hasła w bazie. Wykorzystuję do tego taką funkcję:

  1. function hashPasswd($passwd)
  2. {
  3. $salt = substr(md5(microtime() . substr($passwd, 1, 3)), 0, 32-strlen($passwd));
  4. return array('passwd' => MD5($passwd.$salt), 'salt' => $salt);
  5. }


Szybkie objaśnienie: użytkownik może dać hasło maksymalnie 20-znakowe, ale znając życie będzie ono w stylu „dupa”, więc banalne do odgadnięcia przy użyciu tęczowych tablic. Tak więc biorę aktualny czas jako rzecz w jakimś tam stopniu losową, doklejam 3 litery oryginalnego hasła, haszuję przy pomocy MD5 i ucinam wynik do tylu znaków, ile brakuje hasłu użytkownika do 32 znaków.
W ten sposób powstaje sól, którą doklejam do hasła, które użytkownik podał i dopiero „standardowo” haszuję, by wstawić do bazy.


Podobne rozwiązania widziałem wcześniej w w wielu innych skryptach przy tworzeniu soli czy losowych danych do własnego mechanizmu sesji.
No właśnie, LOSOWYCH. Jeśli generujemy losowe dane, to dlaczego tak często widzę użycie funkcji microtime() zamiast po prostu rand()? Z tego co podaje Wikipedia bardzo dobrze do tego nadaje się linuksowy /dev/random, który śledzi sprzętowe odchylenia, żeby generować losowe liczby - czy można z /dev/random skorzystać w skrypcie php?

Wiem, że nie tworzę skryptu dla NASA czy CIA, ale jeśli mamy do dyspozycji „lepsze” i „gorsze” rozwiązania, to chyba warto wiedzieć takie rzeczy i z nich korzystać...

A jak przy okazji macie jakieś sugestie do mojego mechanizmu „solenia”, to chętnie wysłucham (IMG:style_emoticons/default/winksmiley.jpg) Tylko, żeby to nie przerodziło się w świętą wojnę, czy w ogóle warto solić - poczytałem argumenty obu stron i przy samej idei „solenia” pozostanę (IMG:style_emoticons/default/winksmiley.jpg)

pozdr.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
everth
post
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Ja używam czegoś takiego:
  1. function getRandomPrefix($length=6) {
  2. $rand_string = str_ireplace('\"','',base64_encode(mt_rand()));
  3. $result = substr($rand_string,0,$length);
  4. if (strlen($result)<$length) {
  5. $result .= getRandomPrefix();
  6. $result = substr($rand_string,0,$length);
  7. }
  8. return $result;
  9. }


Powyższe generuje według mnie słabą sól (jest to jednak jedyna metoda jakiej używam pod PHP). Zazwyczaj używam statycznej soli - dynamicznie generowania to dla mnie strata czasu i zasobów (a hasło 'dupa' jest do złamania w ciągu kilku minut/godzin za pomocą ataku słownikowego), pod linuxem możesz uzyskać fajne ciągi za pomocą konsoli:
Kod
cat /dev/urandom | head -n "preferowana długość ciągu" | strings | tr -d '\n\t' | tr -d '\"'

I przede wszystkim nigdy nie używam do haszowania funkcji md5 - jeśli mogę użyć funkcji hash() to używam jej z parametrem sha512, w przeciwnym wypadku używam sha1, znacznie bezpieczniejsza od md5 i wydajnościowo niewiele gorsza. md5 obecnie nadaje się tylko do tworzenia identyfikatorów (np. kluczy w bazach danych)

Ten post edytował everth 21.07.2010, 15:34:05
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 16:37