Hash de Senhas com API Password Hashing no PHP

Hash de Senhas com API Password Hashing no PHPNo post de hoje vou falar sobre uma novidade de segurança que foi adicionada na versão do PHP 5.5, estamos falando da API Password Hashing para gerar e comparar hash de senhas com PHP.

É muito comum nos dias atuais encontrar artigos na WEB aconselhando a nunca gravar senhas no banco de dados em texto puro, ou seja, a indicação é para criptografar ou gerar um hash da senha antes da gravação no banco.

Outros posts sobre PHP que podem interessar:

PHP diferença entre Aspas e Apóstrofos

10 pegadinhas PHP escondidas na linguagem

Dicas de Segurança com PHP

Mas aí vem a dúvida e muitas vezes confusão:

Qual a diferença entre Criptografia e Hash?

CRIPTOGRAFIA: Basicamente temos a codificação de um texto qualquer de uma maneira que não seja possível sua leitura, utilizando uma fórmula matemática e uma chave de conversão. Com essa chave será possível reverter essa codificação para o texto original.

Textos criptografados PODEM ser revertidos!

HASH: Basicamente quando usamos um algorítimo para gerar hash de um texto, estamos criando um novo texto mas sem o uso de chaves. Esse novo conjunto de caracteres fica ilegível como a criptografia, porém não poderá mais ser revertido ao texto original.

Textos em hash NÃO PODEM ser revertidos!

 

Agora que entendemos a diferença fica mais fácil entender porque gerar hash das senhas é mais seguro, simples a senha não poderá mais ser revertida ao texto original.

Mas ainda temos um problema, o PHP possui algumas funções para gerar hash que usam alguns algorítimos bem populares como MD5 e SHA1. Esses algorítimos são bons mas possuem um custo computacional para cálculos relativamente baixo, além de já possuirem em diversos sites na WEB uma base de dados com vários hashs e suas respecticas palavras gravadas, então podemos informar o valor md5 e após uma procura na base de dados o site nos retorna o valor em texto puro que foi encontrado.

Post relacionado:  Conexão PDO com SQL Server 2008 e 2012 no Ubuntu | Dica

Isso ocorre porque seu eu gerar um hash MD5 do meu nome “william” será igual ao hash “fd820a2b4461bddd116c1518bc4b0f77“, o problema é que esse hash de 32 caracteres sempre será igual não importa em qual linguagem eu gere esse valor usando o  algorítimo MD5, por isso se tornou fácil catalogar esses hashs na WEB.

API Password Hashing

Uma forma de contornar todos esses problemas é a nova API para gerar hash de senhas que foi implementada a partir do PHP 5.5, o interessante nessa API é a simplicidade para usar e o bom nível de segurança oferecido.

A ideia básica de gerar um hash a partir de uma string contínua a mesma, mas foi adicionado uma funcionalidade chamada “salt” que consiste em, adicionar antes da string uma outra string aleatória que pode ser passada como parâmetro ou gerada automaticamente pela função. Com isso será muito difícil (não impossível) que exista uma base com esses hashs catalogados, pois quem vai saber qual “salt” foi adicionado antes da senha!

Password-Hashing

Observação: É recomendado na documentação oficial que o “salt” não seja passado como parâmetro e a própria função gere a string, pois essa funcionalidade será depreciada em breve na versão 7 do PHP.

API Password Hashing traz 4 funções:

  • password_get_info($hash) – Retorna um array com informações sobre o hash passado como parâmetro
  • password_hash($password, $algoritimo, [$options]) – Retorna o hash que foi gerado da senha passada como primeiro parâmetro, baseado na constante do algorítimo passado como segundo parâmetro, geralmente (PASSWORD_DEFAULT), terceiro parâmetro é opcional e pode conter informações como o valor do custo computacional.
  • password_needs_rehash($password, $algoritimo, [$options]) – Retorna um valor booleano TRUE se o hash passado como parâmetro não foi gerado com a mesma constante de algorítimo e opções que também são passados como parâmetro, retorna FALSE caso contrário.
  • password_verify($password, $hash) – Retorna um valor booleano TRUE se o password passado como primeiro parâmetro for igual ao hash passado como segundo parâmetro, retorna FALSE caso contrário.
Post relacionado:  Dicas de Segurança com PHP

Exemplo

 

Resultado no Browser

Gerando Password Hashing 1

Agora observem que se eu pressionar a tecla F5 e carregar novamente a mesma página, o valor do hash gerado será modificado, essa é uma das diferenças entre usar MD5, SHA1 e a API Password Hashing pois está sendo gerado um salt aleatório pela própria função, mas está sendo mantido o mesmo valor de senha “william”, então sempre que é executada a página é modificado esse salt e consequentemente o valor do hash:

Gerando Password Hash 2Bom pessoal, chegando ao final desse post onde fiz uma pequena introdução sobre a nova API Password Hashing do PHP 5.5, também foi possível trazer alguns conceitos sobre criptografia, hashing e pontos falhos em usar os algorítimos MD5 e SHA1.

Post relacionado:  Sistema de Login com AJAX e PHP - Blindado

Como já citei em outros posts, não existe aplicação 100% segura (ainda mais na WEB) mas sempre podemos colocar barreiras que dificultam mais ainda a ação dos invasores.

Até a próxima …

Show Buttons
Hide Buttons