Uma maneria simples e segura de criar hash para senhas é a função password_hash
, ela está disponível de forma nativa desde a versão 5.5 do PHP e pode ser usada em versões anteriores com uma extensão própria.
A função password_hash
como outras funções que geram esse tipo de saída é de mão única, ou seja, não permite que o resultado seja convertido para o seu valor original.
Um grande diferencia que torna a função password_hash
mais segura que outras funções é que ela gera diferentes saídas hash para uma mesma entrada. Isso acontece pois internamente ela gera um sal aleatório, tornando o hash muito mais seguro. Veja alguns exemplos comparando as funções password_hash
, md5
e sha1
:
<?php
$senha = 'teste';
for ($i = 0; $i < 3; $i++)
{
var_dump(md5($senha));
}
for ($i = 0; $i < 3; $i++)
{
var_dump(sha1($senha));
}
for ($i = 0; $i < 3; $i++)
{
var_dump(password_hash($senha, PASSWORD_DEFAULT));
}
As saídas para cada função foram:
md5
698dc19d489c4e4db73e28a713eab07b
698dc19d489c4e4db73e28a713eab07b
698dc19d489c4e4db73e28a713eab07b
sha1
2e6f9b0d5885b6010f9167787445617f553a735f
2e6f9b0d5885b6010f9167787445617f553a735f
2e6f9b0d5885b6010f9167787445617f553a735f
password_hash
$2y$10$o8tCMq0N4qat4/PW7XO2JOeeIomMby4rmpXaVMhWpwjUfFCp/dqpW
$2y$10$Ts.lersS./mjhmRbmagdZOHc/ex.bCZXScTk5exx5m01FrVXa7g2S
$2y$10$4L4K.bj4S6jd/PE/xJxnheWTL83JRZ9TYS91QwQU1vRrJpQuqI59a
Analisando os resultados, fica claro o motivo pelo qual a função password_hash
é mais segura, nenhuma das saídas foi igual a anterior, diferente das outras duas funções que retornam sempre o mais hash de saída para a mesma entrada.
A função password_hash aceita três tipos de algoritmo para gerar o hash, são eles:
Algoritmo | Descrição |
---|---|
PASSWORD_DEFAULT | Usa o algoritmo bcrypt. |
PASSWORD_BCRYPT | Usa o algoritmo CRYPT_BLOWFISH para criar o hash. |
PASSWORD_ARGON2I | Usa o algoritmo Argon2 para criar o hash. |
Normalmente depois de um usuário escolher uma senha na aplicação, não é ela que é salva no banco de dados. Para aumentar a segurança dos sistemas ao invés de salvar a senha escolhida pelos usuários, os desenvolvedores criam hash para eles e os salvam.
Como vimos nesse artigo, uma boa maneira de gerar o hash é com a função password_hash
, assim como ela existe outra função nativa no PHP que valida uma senha digitada pelo usuário. O funcionamento dela é bastante simples, só é necessário o hash armazenado e a senha digitada. Veja o exemplo a seguir:
<?php
// Senha escolhida pelo usuário
$senha = 'teste';
// Hash armazenado no banco de dados
$hash = password_hash($senha, PASSWORD_DEFAULT);
// senha digitada , hash do banco
password_verify('teste', $hash));
A função password_verify
retornará TRUE
quando a senha digitada for compatível com o hash do banco de dados.