Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy hasła na mojej stronie są wystarczająco bezpieczne?
Forum PHP.pl > Forum > PHP
amadro
Witam,

mam stronę z logowaniem która koduje hasło takim oto sposobem :
W pierwszej linijce dodaję kilka znaków i powtarzam trzy razy hasło, aby tekst do zakodowania był dłuższy. Później koduję go metodą base64 a następnie md5.
  1. $newpass = '4g1'.$newpass.'r?'.$newpass.'Gz3'.$newpass.'}>";[])$#&, ';
  2. $newpass = base64_encode($newpass);
  3. $newpass = md5($newpass);

Czy hasło jest bezpieczne (odporne na kolizje itp.)?
Pyton_000
nie. Po co takie zagabaje robić.

Wystarczające jest np. SHA1
A jak chcesz więcej to polecam http://pl1.php.net/manual/en/function.crypt.php

PS. Po kiego wałka tak sobie komplikować życie dodając jakieś dziwne rzeczy?
fate
to nic nie bo sprawdzaniu i tak wystarczy wstawić $newpass
samo przechowywanie wystarczy:
http://www.php.net/manual/en/function.hash.php
Michael2318
Używanie kilka funkcji kodujących to raczej nie najlepsze rozwiązanie.
Zamiast tego polecam przy rejestracji zapisywać do bazy datę rejestracji usera w postaci timestamp i wtedy jego hasło twórz sobie w ten sposób:

  1. $password = trim($_POST['pass']); // hasło z inputa, które podał user
  2. $date = time(); // obecny czas
  3.  
  4. $create_password = sha1($date.$password.$date);


I w tym momencie nie dość, że masz ładnie zakodowane hasło to jeszcze dochodzi do tego hasła unikalna sól.
Przy próbie logowania jak sprawdzasz w bazie czy istnieje podany nick i czy hasło się zgadza, pobierasz dodatkowo datę rejestracji danego usera i sprawdzasz czy hasło jest poprawne w ten sam sposób czyli:

  1. $password = trim($_POST['pass']); // hasło z inputa, które podał user
  2. $date_reg = $row['user_regdate']; //pobieramy z bazy datę rejestracji usera
  3. $pass = $row['user_password']; // zakodowane hasło usera z bazy
  4.  
  5. if ( sha1($date_reg.$password.$date_reg) == $pass )
  6. {
  7. // poprawne
  8. }
  9. else
  10. {
  11. die('hasło jest błędne');
  12. }
Pyton_000
A wystarczy
  1. crypt('haslo', '$2a$07$__22_znaki_soli__$')
Michael2318
Można i tak, ważne żeby była sól i żeby nie używał do tego md5, reszta już zależy od niego.
kreatiff
Z ciekawostek, to w skrypcie forum MyBB 1.6 tak tworzą hasha hasła:
  1. $hash = md5(md5($salt) . md5($newpass));
Sól to losowy ciąg 8 znaków (małych i wielkich liter oraz cyfr). Też gdzieś tam w plikach jest jakaś funkcja generująca tę sól, więc można odszukać jak ktoś zainteresowany.

Ale MyBB nie miało aktualizacji już chyba niemal 2 lata, więc w nowszej wersji, która ma się pojawić jakoś niedługo pewnie to zmienią.
Pyton_000
Szkoda że jeszcze ze 4x nie przepuścili przez MD5 haha.gif
szajens
Gdzieś na niebezpieczniku czytałem że podwójne hashowanie jedynie przyspiesza znalezienie kolizji, było tam wszystko super wyjaśnione, niestety nie mogę znaleźć teraz tego artykułu
thek
Owszem przyspiesza. Jest to zresztą logiczne i bez wywodów. Dowolny ciąg do hashowania jest zamieniany zawsze w ten sam określony hash. Już przy pierwszym przebiegu mamy kolizje, bo ilość hashy wyjściowych jest ograniczona. Teraz te wyjściowe znów są hashowane co ponownie mapuje się na określoną i ograniczoną ilość. Przez takie podejście coraz większa ilość kombinacji ciągów wejściowych mapuje się na dokładnie ten sam hash wyjściowy. Co zabawniejsze... przy każdym drugim i dalszych tak naprawdę nie ma już sensu tego robić bo mamy do czynienia z mapowaniem między dokładnie taką samą ilością potencjalnych kombinacji ciągów wejściowych co wyjściowych. Można więc to bardziej porównać do najbadziewniejszego ogromnego słownika, który wymienia ten sam ciąg na inny. Bezsensowność więc wielokrotnego hashowania staje się widoczna jak na dłoni.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.