Bóson Treinamentos em Ciência e Tecnologia

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

Senhas seguras com funções de hash no PHP

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:

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:

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.

 

Sair da versão mobile