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:
<?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:
<?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:
<?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.
Implemente o registro descrito acima com senha com salt.