Aggiunta del salt alla registrazione

Dunque, sai già che l'hash tramite md5 è un processo irreversibile e un hacker, che ottiene l'hash, non potrà ricavare la password da questo hash.

In realtà questa affermazione non è del tutto vera - attualmente hacker malintenzionati hanno creato librerie di hash di password popolari e non e qualsiasi sciocco può decifrare la password, semplicemente cercando il suo hash su Google.

Si tratta di password abbastanza semplici e popolari.

Cerca su Google, ad esempio, l'hash 827ccb0eea8a706c4c34a16891f84e7b e vedrai immediatamente nei risultati di Google, che è la password '12345'.

Gli hash di password abbastanza complesse non possono essere decifrati in questo modo (provalo).

Potresti chiederti, qual è il problema allora - facciamo sì che tutti ci registriamo con password complesse. C'è, tuttavia, un problema - la maggior parte degli utenti non pensa alla sicurezza dei propri dati e potrebbe inserire password abbastanza semplici.

Possiamo obbligare a creare password più lunghe durante la registrazione, limitando, ad esempio, il numero minimo di caratteri a 6 o 8, tuttavia, continueranno ad apparire password come '123456' o '12345678'.

Si potrebbe, certamente, ideare un algoritmo più intelligente per verificare la complessità della password, ma c'è un'altra soluzione.

L'essenza di questa soluzione è questa: le password devono essere salenate. Il salt (sale) è una stringa casuale speciale, che verrà aggiunta alla password durante la registrazione e l'hash sarà calcolato non dalla semplice password, ma dalla stringa salt+password, cioè dalla password salata.

Cioè durante la registrazione farai qualcosa del genere:

html<?php
  $salt = '1sJg3hfdf'; // salt - stringa casuale complessa
  $password = md5($salt . $_POST['password']); // convertiamo la password in un hash salato
?>

In questo caso il salt sarà diverso per ogni utente, deve essere generato in modo casuale al momento della registrazione.

Ecco una funzione pronta che lo farà:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // lunghezza del salt
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // carattere dalla ASCII-table
    }
    
    return $salt;
  }
?>

Con questa funzione puoi riscrivere il nostro codice in questo modo:

html<?php
  $salt = generateSalt(); // salt
  $password = md5($salt . $_POST['password']); // password salata
?>

Lo ripeto ancora, questi erano cambiamenti durante la registrazione - nel database salviamo non semplicemente l'hash della password, ma l'hash della password salata.

Non è tutto: nella tabella degli utenti oltre ai campi login e password è necessario avere anche un campo salt, in cui conserveremo il salt di ogni utente.

Задание 1

Implementate la registrazione descritta sopra con la password salata.