Felipe Weckx

Utilizando a nova API de hash de senhas do PHP 5.5

Introdução

O armazenamento de senhas de usuários de um sistema ou site é um assunto que nem sempre recebe a atenção necessária. Muitos armazenam a senha como texto puro ou utilizam métodos fracos de criptografia, gerando inúmeros casos de vazamento de senhas. Embora parte do problema seja a segurança do acesso aos servidores e bases de dados, devemos tentar sempre garantir que, uma vez com acesso aos dados o intruso não consiga obter o valor das senhas.

Para garantir que não seja possível obter o valor da senha de um usuário, mas ainda seja possível confirmar que a senha que o mesmo digitou é correta podemos utilizar uma função hash. Esta é uma função que à partir de um valor de entrada gera um valor de saída que não pode ser usado para restaurar o valor original, ou seja, é uma criptografia de mão única.

Por isto as funções de hash são tão boas para o armazenamento de senhas: uma vez criptografada a senha ninguém consegue saber qual era o seu valor original. Em teoria. Existem muitos algoritmos de funções hash como: MD5 e SHA1. O problema de utilizar estes algoritmos diretamente para criptografar a senha é que existem diversas bases de hashes pré calculados, por exemplo, vamos gerar um hash MD5 da senha:  felipe0111

Este script gera a saída:

Uma simples busca no Google pelo valor do hash já nos permite descobrir o valor da senha. Então não podemos utilizar simplesmente a função MD5 para gerar o hash. A função SHA1 é mais moderna, mas também existem diversas bases de hashes calculados.

API de hash de senhas do PHP

Para facilitar a vida dos desenvolvedores e prover uma forma segura de armazenamento de senhas o PHP 5.5 adicionou algumas novas funções específicas para o tratamento de senhas. Estas funções são muito práticas e úteis, podendo (e devendo) ser utilizadas em qualquer código de armazenamento de senhas de usuários.

A maior vantagem de utilizar estas funções é que, se utilizadas corretamente, as senhas são atualizadas automaticamente conforme algoritmos de hash mais seguros são criados, graças à constante PASSWORD_DEFAULT que refere-se sempre à função de hash recomendada.

Utilizando a API

Gerando o hash

O uso da API é bastante simples, basicamente utilizamos apenas as funções password_hash,  password_verifypassword_needs_rehash. Então, por exemplo, ao gravar a senha de um usuário no banco de dados devemos antes passar o valor pela função password_hash:

Bastante simples. Notem o uso da constante PASSWORD_DEFAULT esta é uma constante que pode ser alterada dependendo da versão do PHP e vai sempre ter o algoritmo de hash mais forte que o PHP tiver, então é importante que o local de armazenamento deste hash (ex: campo da base de dados) tenha um tamanho suficiente, com margem para crescimento.

Comparando o hash

Com a senha gravada como hash, podemos utilizar a função password_verify para verificar se um valor passado confere com o hash. É importante utilizar esta função para comparar pois, se o hash tiver sido gerado com um algoritmo diferente do atualmente configurado em PASSWORD_DEFAULT o hash não irá bater. A função password_verify automaticamente identifica o algoritmo utilizado e usa o mesmo para conferir.

Atualizando o hash com novo algoritmo

Outra vantagem da API de senhas do PHP é que podemos verificar se há um algoritmo mais forte para gerar o hash da senha. Ou seja, se numa versão nova do PHP for incluído um algoritmo de hash mais forte, a constante PASSWORD_DEFAULT terá seu valor alterado, mas nossas senhas permanecerão armazenadas com o algoritmo antigo. Isto não gera problemas na comparação com password_verify, mas pode tornar mais fácil a descoberta das senhas. Para isto há a função password_needs_rehash que indica se a senha precisa ser criptografada novamente:

Conclusão

A API de hash de senhas do PHP é uma ótima adição à linguagem, dando organização e um método de trabalho claro para lidar com o armazenamento e verificação de senhas. Com poucas funções ela organiza bem todo o fluxo de autenticação com senhas e ao utiliza-la podemos minimizar os dados causados por uma invasão ou vazamento de dados.

Deixe um comentário

Deixe uma resposta

O seu endereço de e-mail não será publicado.