Adição de salt no registro

Então, você já sabe que o hash usando md5 é um processo irreversível e um hacker, que obtém acesso ao hash, não poderá obter a senha a partir desse hash.

Na verdade, essa afirmação não é totalmente verdadeira - atualmente, hackers mal-intencionados compilaram bibliotecas de hashes de senhas populares e não tão populares, e qualquer pessoa pode descobrir a senha simplesmente pesquisando o hash no Google.

Isso se refere a senhas suficientemente simples e populares.

Pesquise no Google, por exemplo, o hash 827ccb0eea8a706c4c34a16891f84e7b e você verá imediatamente nos resultados da pesquisa que é a senha '12345'.

Hashes de senhas suficientemente complexas não podem ser descobertos dessa forma (tente).

Você pode perguntar, qual é o problema então - vamos todos nos cadastrar com senhas complexas. No entanto, há um problema - a maioria dos usuários não pensa na segurança de seus dados e pode digitar senhas bastante simples.

Podemos, no momento do registro, forçar a criação de senhas mais longas, limitando, por exemplo, o número mínimo de caracteres para 6 ou 8, no entanto, ainda assim aparecerão senhas como '123456' ou '12345678'.

Claro, é possível criar um algoritmo mais inteligente para verificar a complexidade da senha, mas há outra solução.

A essência dessa solução é a seguinte: as senhas precisam ser salizadas (temperadas com salt). O salt (sale) é uma string aleatória especial, que será adicionada à senha durante o registro, e o hash será calculado não a partir da senha simples, mas a partir da string salt+senha, ou seja, a partir da senha salizada (com salt).

Ou seja, durante o registro você fará algo assim:

html<?php
  $salt = '1sJg3hfdf'; // salt - uma string aleatória complexa
  $password = md5($salt . $_POST['password']); // transformamos a senha em um hash com salt
?>

Neste caso, o salt será diferente para cada usuário, ele precisa ser gerado aleatoriamente no momento do registro.

Aqui está uma função pronta que fará isso:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // comprimento do salt
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // caractere da tabela ASCII
    }
    
    return $salt;
  }
?>

Usando esta função, podemos reescrever nosso código assim:

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

Repito mais uma vez que essas foram alterações feitas durante o registro - no banco de dados salvamos não apenas o hash da senha, mas o hash da senha com salt.

Isso ainda não é tudo: na tabela de usuários, além dos campos login e password, é necessário criar também um campo salt, no qual armazenaremos o salt de cada usuário.

Задание 1

Implemente o registro descrito acima com senha com salt.