Łapka LogoŁapka Infa
🌐
INF.03

Bezpieczeństwo: Hashowanie Haseł

Kiedyś logowało się z czystym tekstem. Dziś robisz md5. Nie, zrób to lepiej: wykorzystaj password_hash()!

Szyfrowanie (Hashowanie) Haseł

Wiele arkuszy CKE INF.03 z ostatnich lat poszło o krok do przodu i zaczęło dbać o bezpieczeństwo sieci. CKE przestało pisać w zadaniach: "Zapisz hasło wprost do bazy jako tekst", a zaczęło żądać od egzaminowanych używania szyfrowania (Hash).

Nigdy nie trzymamy hasła klienta jako Kamil123. Gdyby baza wyciekła (hackerzy się włamali), każdy natychmiast poznałby hasło. Pamiętaj, że większość ludzi używa tego samego hasła na każdej stronie!

Przeszłość (i zadania egzaminacyjne starego typu): SHA1 i MD5

Dawniej pisano tak: $zaszyfrowane = sha1($hasloPobrane); Generowało to długi, niezrozumiały ciąg cyfr i znaków.

Teraźniejszość i Przyszłość: password_hash()

Najnowocześniejsze standardy wymagają funkcji password_hash(). Używa ona silnego algorytmu Bcrypt i tzw. "Solenia" (każde hasło przed zaszyfrowaniem dodaje szum, by dwa razy słowo Kamil123 wygenerowało zupełnie dwa różne hashe!).

Zapis podczas Rejestracji Użytkownika do Bazy SQL:

<?php
    $haslo_z_formularza = $_POST["haslo"];
    
    // Hashowanie! PASSWORD_DEFAULT obecnie korzysta z bcrypta
    $hash_do_bazy = password_hash($haslo_z_formularza, PASSWORD_DEFAULT);
    
    // Teraz zapisujesz do bazy ten wygenerowany długi $hash_do_bazy
    // echo $hash_do_bazy; // Zobaczysz np: $2y$10$w8T9p1Y...
?>

Sprawdzanie podczas Logowania (Weryfikacja)

Problem. Jeżeli szyfrujemy hasło "Kamil123" w ten sposób, że za każdym razem wychodzi INNY hash, to jak potem przy logowaniu możemy wiedzieć, czy się zgadza z tym w bazie? Do akcji wkracza wbudowana genialna funkcja de-rygująca: password_verify(). To ona zajmuje się sprawdzeniem zawiłości matematycznych.

<?php
    // $haslo_wpisane = "Kamil123"; (to co ktoś wpisał przy logowaniu!)
    // $hash_w_bazie = to co wyciągnąłeś za pomocą SELECT i while(fetch_assoc) na poprzedniej stronie!
    
    if (password_verify($haslo_wpisane, $hash_w_bazie)) {
        echo "Hasło Prawidłowe! Loguję...";
        $_SESSION['zalogowano'] = true;
    } else {
        echo "Złe hasło!";
    }
?>

Opanuj password_hash oraz password_verify, a odhaczysz bez problemu wymagania CKE w najnowszych kluczach punktacji.