Dodawanie soli do rejestracji

A więc, już wiesz, że hashowanie przez md5 - jest procesem nieodwracalnym i haker, który uzyskał dostęp do hasha, nie będzie mógł uzyskać z tego hasha hasła.

W rzeczywistości to stwierdzenie nie jest całkowicie poprawne - obecnie źli hakerzy stworzyli biblioteki hashów popularnych i mniej popularnych haseł i każdy głupek może odgadnąć hasło, po prostu wyszukując jego hash.

Mowa o wystarczająco prostych, popularnych hasłach.

Wyszukaj na przykład hash 827ccb0eea8a706c4c34a16891f84e7b i od razu w wyszukiwarce Google zobaczysz, że to hasło '12345'.

Hashów wystarczająco skomplikowanych haseł w ten sposób nie odgadniesz (spróbuj).

Możesz spytać, w czym w takim razie problem - niech wszyscy będziemy rejestrować się ze skomplikowanymi hasłami. Jest jednak problem - większość użytkowników nie myśli o bezpieczeństwie swoich danych i może wprowadzać wystarczająco proste hasła.

Możemy przy rejestracji zmuszać do wymyślania dłuższych haseł, ograniczając, na przykład, minimalną liczbę znaków do 6 lub 8, jednakże i tak będą pojawiać się hasła typu '123456' lub '12345678'.

Można, oczywiście, wymyślić bardziej inteligentny algorytm sprawdzania złożoności hasła, ale jest inne rozwiązanie.

Istota tego rozwiązania jest taka: hasła trzeba posolić. Sól - to specjalny losowy ciąg znaków, który będzie dodawany do hasła przy rejestracji i hash będzie obliczany nie od prostego hasła, a od ciągu sól+hasło, to znaczy od solonego hasła.

To znaczy przy rejestracji będziesz robić coś takiego:

html<?php
  $salt = '1sJg3hfdf'; // sól - skomplikowany losowy ciąg znaków
  $password = md5($salt . $_POST['password']); // przekształcamy hasło w solony hash
?>

Przy czym sól będzie inna dla każdego użytkownika, trzeba ją będzie generować w sposób losowy w momencie rejestracji.

Oto gotowa funkcja, która to zrobi:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // długość soli
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // znak z ASCII-table
    }
    
    return $salt;
  }
?>

Za pomocą tej funkcji można przepisać nasz kod w ten sposób:

html<?php
  $salt = generateSalt(); // sól
  $password = md5($salt . $_POST['password']); // solone hasło
?>

Jeszcze raz powtórzę, że to były zmiany przy rejestracji - w bazie danych zapisujemy nie po prostu hash hasła, a hash solonego hasła.

To jeszcze nie wszystko: w tabeli z użytkownikami oprócz pól login i password trzeba zrobić jeszcze pole salt, w którym będziemy przechowywać sól każdego użytkownika.

Задание 1

Zaimplementuj opisaną powyżej rejestrację z solonym hasłem.