quarta-feira, 11 de novembro de 2009

Uso de hash (MD5) em banco de Dados é seguro?

Vou começar esse documento perguntado:
Se você necessitasse desenvolver um software que exigisse manter um controle de usuários (login, permissões, ...), como você garantiria a segurança da senha armazenada no banco de dados?

Não tenho a menor dúvida que há uma infinidade de soluções para essa pergunta. Mas o que eu gostaria de tratar nesse post é uma das possíveis soluções bastante difundida e utilizada.
Estou referindo-me ao uso de algoritmos hash, mais especificamente o MD5. Nesse caso, em vez de gravar a senha tal como ela é, grava-se o respectivo hash.

Exemplo

Vamos pensar na estrtura de uma tabela para armazenar a lista de usuários desse sistema.
CREATE TABLE "usuario"
(
    "fullname"  VARCHAR(85) NOT NULL,
    "username"  VARCHAR(20) NOT NULL,
    "passwd"    CHAR(32)
);

OBS: Eu estipulei o tamanho de 32 bytes para o field "passwd" porque o código hash retornado pelo algoritmo MD5 costuma ser uma string com 32 caracteres hexadecimais.

Agora, quando em seu sistema você for cadastrando novos usuários, provavelmente utilizaria um SQL semelhante a este:
INSERT INTO "usuario" (fullname, username, passwd) VALUES ('...', 'mylogin', MD5('minha senha'));

ou talvez calcularia o hash da senha na própria aplicação, persistindo o valor final:
INSERT INTO "usuario" (fullname, username, passwd) VALUES ('Fabius Lovato', 'lovato', 'e10adc3949ba59abbe56e057f20f883e');

Então você faz uma consulta em sua tabela "usuarios" e observa que os registros não exibem uma senha "entendível" e, logo, conclui que mesmo que alguém conseguisse obter esses códigos hash não seria nada fácil convertê-los nas senhas originais.
Aí, acreditando estar seguro, você passa a utilizar esse código como identificador de determinadas transações trafegadas por meios não seguros ou, pior ainda, persiste esse valor em um arquivo texto qualquer.

Talvez não seja novidade para você, mas há grandes bases de dados dedicados que mantém códigos hash para palavras simples e compostas que são usualmente utilizadas. E além disso, essas bases de dados estão disponíveis para o acesso público.
Duvida? Então faça um teste muito simples: Vá até o site de busca do google (http://www.google.com.br/) e cole o código hash do nosso exemplo acima (e10adc3949ba59abbe56e057f20f883e).
Provavelmente você encontrará a resposta estampada nos primeiros links da pesquisa.

Bom, possivelmente você deve estar argumentando que essa é uma senha muito comum e muitos outros artigos a utilizariam com exemplo. Então vamos tentar novamente, mas com o hash a8832562d37247d41a7679612a104997.

Entendeu agora porque o uso de algoritmos de hash não é tão seguros assim?

Links interessantes
Um site muito interessante onde você tem a disposição uma gigantesca base de códigos hash é o md5(); que pode ser acessado pelo link http://md5.rednoize.com/
Na data de publicação desse post, uma nota no rodapé do site informava "Search in 57,035,795 md5/sha1 hashes. 20,612,544 searches answered since feb 2005".
Certamente esses valores são superiores hoje. Inclusive se você esperar alguns segundos e fizer um refresh no site (CTRL + F5), notará que o número de registros dessa base está continuamente crescendo.
Esse site também permite que você gere o código hash de um texto qualquer. Para isso basta digitar um texto que não caracterize um hash md5 válido (32 caracteres hexadecimais).

Se você for web design ou trabalham com aplicações com comunicação/acesso remoto, sugiro a leitura do artigo "Cuidado com sua senha - saiba como funciona a autenticação em sites na web".

Se tiver interesse em saber mais sobre criptografia MD5, um bom artigo está disponível no link http://www.devmedia.com.br/articles/viewcomp.asp?comp=2944.

Se você acha que é só, a lista abaixo ainda não são todos os links que você tem a disposição para localizar um código hash md5. Além disso, alguns desses sites trabalham também com códigos hash de outros algoritmos (sha1, lm e ntlm)
http://tools.benramsey.com/md5/
http://md5.gromweb.com/
http://www.thepanicroom.org/index.php?view=md5
http://shm.hard-core.pl/md5/
http://www.mmkey.com/md5/home.php
http://md5.overclock.ch/
http://www.cmd5.org/
http://www.md5encryption.com/
http://www.md5decrypt.com/
http://www.md5decrypter.com/
http://www.milw0rm.com/md5/
http://plain-text.info/
http://schwett.com/md5/
http://www.tmto.org/
http://www.xmd5.org/
http://passcracking.ru/
http://www.hashchecker.com/
http://gdataonline.com/
Esse último tem uma base de mais de 1 bilhão de hash!

Conclusão
Não importa quão seguro é o algoritmo de hash utilizado, se a senha que você utiliza é intuitiva, fácil e/ou possui poucos caracteres, então temo que ela não seja tão segura quanto você imagina.