Przejdź do głównej zawartości

Haszowanie haseł w PHP

Praca indywidualna – 4–6 stron A4

🔒 Haszowanie haseł w PHP

Opracowanie dotyczy bezpiecznego przechowywania haseł użytkowników w aplikacjach webowych. Hasła nigdy nie powinny być przechowywane w postaci jawnej (plain text) – zamiast tego stosuje się funkcje haszujące, które przekształcają hasło w nieodwracalny ciąg znaków. PHP oferuje wbudowane funkcje password_hash() i password_verify(), które implementują nowoczesne algorytmy haszowania (bcrypt, Argon2) z automatycznym dodawaniem soli.


Bezpieczne przechowywanie haseł jest fundamentem bezpieczeństwa każdej aplikacji:

  1. Ochrona użytkowników – w przypadku wycieku bazy danych hasła pozostają chronione
  2. Wymogi prawne – RODO wymaga odpowiednich środków technicznych ochrony danych
  3. Reputacja – wycieki haseł w plain text niszczą zaufanie do firmy
  4. Standardy branżowe – każdy programista musi znać te techniki
  5. Egzaminy zawodowe – temat pojawia się na egzaminach INF.03/INF.04

  1. Zrozumieć różnicę między haszowaniem a szyfrowaniem
  2. Poznać mechanizm działania funkcji haszujących
  3. Opanować użycie password_hash() i password_verify() w PHP
  4. Zidentyfikować zagrożenia związane z przechowywaniem haseł
  5. Wdrożyć dobre praktyki w praktycznych przykładach

W pracy muszą znaleźć się następujące elementy:

  • Definicja hasza – czym jest funkcja haszująca i jakie ma właściwości
  • Różnica hash vs szyfrowanie – dlaczego haszowanie jest jednokierunkowe
  • Właściwości bezpiecznego hasza – determinizm, nieodwracalność, odporność na kolizje
  • Salt (sól) – czym jest i dlaczego jest niezbędna
  • MD5 i SHA1 – dlaczego są niebezpieczne dla haseł
  • Rainbow tables – czym są i jak działają
  • Brute force – jak szybko można łamać słabe hasze
  • password_hash() – składnia, algorytmy (PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2ID)
  • password_verify() – weryfikacja hasła użytkownika
  • password_needs_rehash() – aktualizacja starych haszy
<?php
// Haszowanie hasła przy rejestracji użytkownika
$plainPassword = $_POST['password'];
// Tworzenie hasza z automatycznym salt
$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);
// $hashedPassword wygląda np. tak:
// $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi
// Zapisanie do bazy danych
$stmt = $pdo->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
$stmt->execute([$email, $hashedPassword]);
?>

Dla osób chcących pogłębić temat:

  • Algorytm Argon2 – porównanie Argon2i vs Argon2id
  • Konfiguracja kosztu (cost) – jak dobrać parametry dla serwera
  • Pepper – dodatkowa warstwa zabezpieczeń
  • Timing attacks – bezpieczne porównywanie stringów
  • Password policies – wymuszanie silnych haseł
  • Biblioteka libsodium – zaawansowane funkcje kryptograficzne

  1. Wstęp – znaczenie bezpieczeństwa haseł w aplikacjach webowych
  2. Podstawy kryptografii – haszowanie vs szyfrowanie
  3. Historia i błędy – MD5, SHA1, rainbow tables
  4. Nowoczesne rozwiązania – bcrypt, Argon2, funkcje PHP
  5. Implementacja praktyczna – rejestracja i logowanie
  6. Zagrożenia i ataki – brute force, dictionary attacks
  7. Dobre praktyki – podsumowanie rekomendacji
  8. Wnioski – najważniejsze zasady

Autor pracy powinien potrafić odpowiedzieć na pytania:

  1. Dlaczego nie można użyć MD5 do haszowania haseł?
  2. Czym różni się haszowanie od szyfrowania?
  3. Co to jest salt i dlaczego jest automatycznie dodawany przez password_hash()?
  4. Jak działa atak typu rainbow table?
  5. Dlaczego password_verify() jest odporne na timing attacks?
  6. Co oznacza “koszt” (cost) w algorytmie bcrypt?
  7. Kiedy używać password_needs_rehash()?
  8. Czy można odszyfrować hash hasła?