inicio mail me! sindicaci;ón

Archive for March, 2007

Encriptação de senhas no banco de dados

A não ser quando for uma requisição explícita por parte do cliente, uma boa prática de desenvolvimento é sempre encriptar senhas presentes no banco de dados.

Essa prática é interessante tanto para questões de segurança quanto de privacidade – afinal não há razões para que nem mesmo administradores tenham acesso às senhas utilizadas por quaisquer usuários.

Muitos desenvolvedores tem isso em mente, entretanto, porém os métodos usuais utilizados para fazer essa encriptação não é a mais adequada. Na maioria das vezes, em especial no mundo php, a função escolhida para fazê-la é a md5().

O problema de utilização do algoritmo MD5 para encriptação é somente um: ele não é um algoritmo de encriptação. Apesar de “ocultar” o conteúdo original de um texto, esse método foi concebido para ser uma função de hashing.

Ok, ele até dificulta que se descubra qual é o texto original. Porém, se você procurar no google, existe uma porção de páginas com listagens de senhas em MD5, assim como de dicas para desenvolvimento de ferramentas de brute force. O principal problema é que, para uma mesma string, o hash gerado é sempre o mesmo.

O que eu costumo fazer para salvar senhas encriptadas é utilizar a função crypt(). Vamos a um exemplo:

$senha = ’1234′;
$senhaCrypt = crypt($senha);

echo $senhaCrypt;

Execute o exemplo algumas vezes; percebe que cada vez que geramos a senha, a string gerada é diferente? Isso já é um excelente ponto para garantirmos a segurança.

Porém, como fazer para desencriptar a string, já que cada vez que ela é gerada temos um diferente resultado? Outro ponto forte, não há como. Para validarmos se a senha informada é igual a senha encriptada no banco, comparamos do seguinte modo:

$senha = ’1234′;
$senhaCrypt = crypt($senha);

// Ignoramos aqui qualquer tipo de validação
$senhaInput = $_POST['senha'];

if(crypt($senhaInput, $senhaCrypt) == $senhaCrypt))
{
echo ‘Senha válida’;
}
else
{
echo ‘Senha inválida’;
}

Note que para comparação das senhas, comparamos a senha encriptada com o resultado de crypt() novamente, porém utilizando como segundo parâmetro a própria senha encriptada.

Obviamente que o demonstrado aqui é um mero exemplo tosco, e precisa ser estendido para funcionar juntamente a um banco de dados e tudo o mais. Mas a idéia fica aí: utilizando-se crypt(), conseguimos um melhor nível de segurança e de privacidade.

Última dica: para guardar a senha encriptada no banco, utilize um campo texto (varchar, por exemplo) de tamanho 34 bytes – a chamada ao crypt() sempre gera uma string nesse tamanho.

Ouvindo: Epos – See thru You