Felipe Weckx

Using the new PHP 5.5 “password API”

Introduction

Storing user passwords in any system or website is a subject that often does not receive the deserved atention. Many systems store the password as plain text or using weak cryptography algorithms, which causes several cases of password de leaks.

To ensure that in case of breach the attacker doesn’t find out the user password we can use a hash function to store it. A hash function creates an output from any input and that output cannot be used to restore the original input.

That’s why hash functions are so good to store passwords. In theory. There are many hashing algorithms such as: MD5 e SHA1. The problem of using these algorithms directly is that there are many pre-compiled hash tables which contain millions of these values. Some techniques, such as Rainbow Tables allow for easy cracking of weaker ciphers. For example, lets make a MD5 hash of the value felipe0111:

Which gives us this:

simple Google search for the hash value gives us the original value, so we obviously cannot use MD5 to store passwords. The SHA1 stronger, but also easily crackable.

The PHP password API

To make things easier for developers and encourage the safe storage and handling of passwords the PHP 5.5  version added a few new functions for this.  One of the big advantages of using this API is that, if used correctly, it ensures that your passwords are always stored with the strongest hashing algorithm available. That is achieved using the PASSWORD_DEFAULT constant.

Using the API

Generating the hash

The simplest use of the API is hashing a password using the password_hash function:

Notice the use of the PASSWORD_DEFAULT constant, using it will make sure that our hash is generated using the strongest hashing algorithm available, so it is important that the place where this hash is stored (ex: database field) is large enough to hold the generated string and also have some growth room (when the algorithm is updated).

Comparing hash

Now that our password is safely stored we can compare the value the user passed with it. That’s achieved using the password_verify function, which simply receives the raw input and the hash to compare. It is imporÉ 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

Leave a Reply

Your email address will not be published.