2015-03-01 15 views
7

Mam BARDZO małą witrynę, a ostatnio próbowałem ją zwiększyć, użyłem do przechowywania moich haseł w postaci zwykłego tekstu.Zwiększenie bezpieczeństwa mojej witryny. Czy używam hasła password_hash?

myślę, robię to dobrze, ale jako „hobby” programista chcę upewnić się, więc proszę was, specjalistów

Gdy użytkownik zarejestrować zrobić: password_hash($their_password, PASSWORD_DEFAULT) i zapisać, że w „Hasło” kolumny w tabeli użytkowników. Używam PASSWORD_DEFAULT, ponieważ wydaje się to najlepsze według php.net. .

Zauważ, że stała ta ma na celu zmieniać w czasie, co nowe i mocniejsze algorytmy są dodawane do PHP”

Brzmi dobrze

a część login (bardzo prosty):

if (count($_POST) > 0) { 

$username = trim($_POST['username']); 
$password = trim($_POST['password']); 

$query = $db->prepare("SELECT password FROM users WHERE username = ?"); 
$query->execute(array($username)); 
$row = $query->fetch(); 

if (password_verify($password, $row['password'])) { 
    echo "Correct password"; 
    // create session... 
} else { 
    // wrong password 
} 

Może powinienem sprawdzić, czy nazwa użytkownika istnieje pierwszy, ale inne niż to, co o tym sądzisz?

+1

Wygląda dobrze .. Jest to sposób na użycie password_hash \ verify. Ważne jest, aby wiedzieć, że algorytm, którego używasz, nazywa się bcrypt, co jest zalecane. Polecam użyć kolumny mysql jako BINARY (60) do zapisywania pamięci, –

+1

Wygląda dobrze dla mnie. Osobiście umieszczę część zapytania w innej części kodu (może owinąć ją w klasę). – Bono

+0

Głosuję, aby zamknąć to pytanie jako nie na temat, ponieważ jest to dobre dopasowanie do http://codereview.stackexchange.com, nie tyle SO. – deceze

Odpowiedz

2

Wygląda na to, że doskonale zrozumiałeś dokumentację i sposób tworzenia kodu, którego potrzebujesz. Wstydź się za pomocą zwykłego tekstu dla hasła nawet tymczasowo, ale twoja decyzja, aby naprawić z prawidłową metodą (tj. Nie md5 jak mi głupie osoba (I naprawdę trzeba aktualizować swoje hasło systemy oszczędzania ...)) jest niesamowity.

Jedyny problem jaki widzę to to, że niektóre osoby mogą zaczynać lub kończyć się spacjami. Takie hasła utracą swoje początkowe/końcowe spacje i rzeczywiście użytkownik może być zaniepokojony tym, że może zalogować się z dwoma polami lub żadnymi! Więc prawdopodobnie najlepiej usunąć te wywołania trim;)

+0

dziękuję. Tak, wstydźcie się, mam na myśli cholerny rok 2015 i macie rację co do wykończenia, powinniście zezwolić użytkownikom na wpisywanie tego, co chcą, jako swojego hasła. teraz usunę te elementy – Smugglaren

-3

Witam :) Jestem także hobbystą i myślę, że mogę wskazać ci właściwy kierunek, mimo że niewiele wiesz o tym, jak dzieje się magia. 1) użytkownik wpisuje swoje hasło, program szyfruje za pomocą określonej metody, a to, że zaszyfrowane hasło zostanie zapisane. 2) bam. Nikt nie widzi oryginału - nawet użytkownik, który go wprowadził. Podczas logowania ta operacja jest powtarzana i hasło "cokolwiek użytkownik wprowadził do logowania" jest szyfrowane przez ten sam proces, a następnie jest porównywane z szyfrowanym zapisanym hasłem. Powinny pasować, jeśli były tym samym niezaszyfrowanym oryginałem.

Dobrze

Dla dodatkowego bezpieczeństwa, coś, co nazywa się „sól” jest czasami „dodany” do procesu szyfrowania, aby uczynić go jeszcze trudniejsze do złamania hasła. Powiedzmy, że ktoś chwycił twój kod szyfrowania ORAZ zaszyfrował listę haseł i próbuje przywrócić ten proces przez odwrotną inżynierię kodu? Cóż, teraz ta osoba ma dodatkową pracę, aby znaleźć to, co jest twoją "solą" ... (może to być ciąg zapisany na serwerze, sprytna gra z datami miesiąca, itd ... wiele opcji) . To jest to, co pamiętam z tego, co czytam. Mnóstwo wskazówek, od których możesz zacząć. I więcej:

używam to: które mam gdzieś w latach internetowych temu

function encryptTheString($password, $salt, $iter_count=4096, $keylen=64,   $hash_alg= 'sha256') 
{ 
    // Compute the length of hash alg output. 
    // Some folks use a static variable and save the value of the hash len. 
    // Considering we are doing 1000s hmacs, doing one more won't hurt. 
    $hashlen = strlen(hash($hash_alg, null, true)); 

    // compute number of blocks need to make $keylen number of bytes 
    $numblocks = ceil($keylen/$hashlen); 

    // blocks are appended to this 
    $output = ''; 
    for ($i = 1; $i <= $numblocks; ++$i) { 
     $block = hash_hmac($hash_alg, $salt . pack('N', $i), $password, true); 
     $ib = $block; 
     for ($j = 1; $j < $iter_count; ++$j) { 
      $block = hash_hmac($hash_alg, $block, $password, true); 
      $ib ^= $block; 
     } 
     $output .= $ib; 
    } 

    // extract the right number of output bytes 
    return substr($output, 0, $keylen); 
} 

i wezwaniem jak

$ePassword=ANDYETpbkdf2($password,"111111111122222222223333333333444444444455555555566666666661234"); 

Byłoby idealnie ok :) dać sha256 odczyt dla początek dalszego oświecenia.

+2

Solenie jest automatycznie wykonywane przez 'password_hash'. Tutaj nie ma potrzeby. –

+0

Cóż, dziękuję, ale nie sądzę, że sól jest konieczna po przeczytaniu php.net, ponieważ password_hash generuje sól dla każdego hashowanego haseł, więc nie musisz się o to martwić. "Zdecydowanie nie zaleca się generowania własnej soli dla tej funkcji, ponieważ automatycznie utworzy ona bezpieczną sól, jeśli jej nie określisz." – Smugglaren

Powiązane problemy