ARTIGOS

Verificação de senhas com password_hash

Uma forma mais segura de verificar senhas

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:

  1. <?php
  2. $senha = 'teste';
  3. for ($i = 0; $i < 3; $i++)
  4. {
  5. var_dump(md5($senha));
  6. }
  7. for ($i = 0; $i < 3; $i++)
  8. {
  9. var_dump(sha1($senha));
  10. }
  11. for ($i = 0; $i < 3; $i++)
  12. {
  13. var_dump(password_hash($senha, PASSWORD_DEFAULT));
  14. }

As saídas para cada função foram:

md5

  1. 698dc19d489c4e4db73e28a713eab07b
  2. 698dc19d489c4e4db73e28a713eab07b
  3. 698dc19d489c4e4db73e28a713eab07b

sha1

  1. 2e6f9b0d5885b6010f9167787445617f553a735f
  2. 2e6f9b0d5885b6010f9167787445617f553a735f
  3. 2e6f9b0d5885b6010f9167787445617f553a735f

password_hash

  1. $2y$10$o8tCMq0N4qat4/PW7XO2JOeeIomMby4rmpXaVMhWpwjUfFCp/dqpW
  2. $2y$10$Ts.lersS./mjhmRbmagdZOHc/ex.bCZXScTk5exx5m01FrVXa7g2S
  3. $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.

Tipos de algoritmos

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.

Como validar o hash gerado

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:

  1. <?php
  2. // Senha escolhida pelo usuário
  3. $senha = 'teste';
  4. // Hash armazenado no banco de dados
  5. $hash = password_hash($senha, PASSWORD_DEFAULT);
  6. // senha digitada , hash do banco
  7. 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.

COMENTE SOBRE