Armazenando senhas de forma segura em PHP – funções de hash

Como armazenar senhas de forma segura em PHP com funções de hash

Uma das tarefas mais importantes na criação de uma aplicação Web é oa autenticação e controle de acesso dos usuários. A forma mais comum de se realizar controle de acesso é por meio de um par nome de usuário / senha, que devem ser armazenados de alguma forma em um banco de dados, para que seja possível verificar as credenciais do usuário no momento de login no sistema.

Mas como armazenar essas informações de forma segura, principalmente senhas? 

Nesta lição vamos mostrar como armazenar senhas em um banco de dados de forma segura, usando funções de criptografia em PHP.

Hashes

Um hash é um valor matemático computado sobre um texto plano, como uma senha, usando algoritmos específicos.

As funções de Hash são usadas para verificar a integridade dos dados para garantir que não tenham sido inadvertidamente alterados, como por exemplo, verificações de senhas. 

Existem vários algoritmos de hash que podem ser empregados para esse fim, e no PHP vamos usar a função criptográfica bcrypt, que é baseada na cifra Blowfish, e implementada por meio da função “password_hash()“.

Acrescentando Salt

Em criptografia, chamamos de salt a um dado aleatório que é usado como uma entrada adicional para uma função que efetua o hash de uma senha. São caracteres aleatórios acrescentados à senha antes de ela ser hasheada. A principal função dos salts é defender a senha armazenada contra ataques de dicionário ou contra ataque de hashes pré-calculados, realizados por meio do uso de rainbow tables.

Função password_hash()

Sintaxe:

string password_hash ( string $senha , integer $algoritmo, array $opções )

Onde:

  • $senha é a senha fornecida que deve ser hasheada.
  • $algoritmo é o algoritmo de hash que deve ser utilizado no processo. Os algoritmos suportados são:
    • PASSWORD_DEFAULT – algoritmo bcrypt. Se usado, recomenda-se armazenar o resultado do hash em um campo que permite até 255 caracteres, por questões de boas práticas.
    • PASSWORD_BCRYPT – Usa o algoritmo CRYPT_BLOWFISH para criar o hash, resultando em uma string de exatos 60 caracteres.
    • PASSWORD_ARGON2I – Utiliza o algoritmo Argon2 para a criação do hash.
  • $opções é um array associativo que indica configurações especiais para a função. Estão disponíveis as duas funções a seguir:
    • salt – permite fornecer manualmente um valor de salt à função – por padrão, o salt é gerado automaticamente, de forma aleatória. É recomendado não gerar o salt manualmente. Note que esta opção foi deprecada no PHP 7.0.
    • cost – indica o custo algorítmico que deve ser utilizado. Por padrão, é usado o valor 10.

A função retorna uma string contendo o hash da senha, ou o valor FALSE se algo der errado. Tanto o custo quanto o salt são retornados como parte do próprio hash, de modo que não precisam ser armazenados separadamente.

Exemplo:

Suponhamos que seja necessário efetuar a gravação da senha de um usuário a partir de uma tela de cadastro, para que posteriormente seja comparada à senha fornecida no momento de login quando o usuário for tentar se logar no sistema.

A senha escolhida pelo usuário é enviada ao script de processamento por meio do método POST, e seu hash é gerado da seguinte maneira:

$hashsenha = trim(password_hash($_POST['senha'], PASSWORD_DEFAULT));

onde ‘senha‘ é o nome do campo de origem do valor da senha na página de cadastro, e $hashsenha é a variável que irá conter o hash da senha criado, o qual deverá então ser armazenado no banco de dados juntamente com os demais dados de login necessários.

A função trim() é usada para eliminar eventuais espaços em branco no início e no final da string gerada.

Função password_verify()

Essa função verifica se uma senha fornecida confere com um hash armazenado.

Sintaxe:

boolean password_verify(string $senha, string $hash_da_senha)

onde:

  • $senha é a senha fornecida pelo usuário
  • $hash_da_senha é o hash da senha do usuário, criado com a função password_verify(), que está armazenado em algum lugar, como um banco de dados.

A função retorna TRUE se a senha conferir com o hash, ou FALSE em caso contrário.

Código de exemplo

<?php
 echo "Criando hash de senha com salt e testando:<br>";
$hashSenha = password_hash('123', PASSWORD_DEFAULT);
if (password_verify('123', $hashSenha)) {
  echo "Senha correta<br>";
  echo "O Hash da senha é " . $hashSenha;
}
else {
  echo "Senha incorreta!";
}
?>

No código de exemplo acima, criamos um hash para a senha fornecida, que no caso é a senha “123“, usando as configurações padrão da função password_hash()

Esse hash é armazenado na variável $hashSenha. Logo após, temos um mecanismo para realizar a verificação da senha, usando a função password_verify().

Passamos para essa função a senha “123” (para verificação) e a variável que contém o hash da senha correta. Caso a senha passada coincida com a senha correta, serão exibidas as mensagens “Senha correta” e “O hash da senha é [hash]”. Caso contrário, será exibida a mensagem de erro “Senha incorreta!”.

Você pode testar o algoritmo usando a senha correta e também passando uma senha errada, para verificar as mensagens exibidas.

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*