Face ao ocorrido com o site MeAdiciona.com conforme seu comunicado, aproveito para comentar sobre este assunto que parece não ter prioridade entre a maioria dos desenvolvedores (iniciantes) de aplicações web.
O site agregador de links MeAdiciona.com foi alvo de uma invasão bem sucedida no início do ano, tendo (parte do) seu banco de dados copiado e recentemente disponibilizado para download na web.
É mais que recomendado aos usuários/clientes/navegantes utilizar senhas distintas para os diferentes serviços e/ou sites.
Não utilizar senhas fáceis – partes do nome, sequências numéricas, datas importantes (aniversários, namoro, casamento) – são algumas das dicas mais comuns, mas a intenção deste post é tratar dos cuidados que os desenvolvedores devem ter com suas aplicações.
O MeAdiciona.com explica-se, afirmando que não armazena as senhas dos serviços aos quais faz links, e que a senha do cadastro do usuário no site é armazenada criptografada, utilizando o algoritmo MD5.
Este algoritmo gera um conjunto de 32 caracteres aleatórios (letras e números) de forma unidirecional (one-way hash), ou seja, não é possível converter um hash MD5 para o texto original.
Teoricamente isso é verdade, mas na prática é uma inverdade – principalmente se a senha em questão é fraca e/ou comum.
Existem sites que disponibilizam gigantescas coleções de hash, como exemplos: o MD5(); e o GData, que possuem respectivamente 55.289.759 e 1.133.761.482 de hashes para consulta/verificação (até o momento que este post foi escrito).
Tendo a sua senha criptografada apenas com MD5, com uma simples busca nos sites mencionados é possível que se consiga descobrir a senha original – novamente reforçando: principalmente se ela for fraca e/ou comum.
Exemplos de senhas (fracas) e seus respectivos hashes:
- teste = 698dc19d489c4e4db73e28a713eab07b
- 123456 = e10adc3949ba59abbe56e057f20f883e
- abc123 = e99a18c428cb38d5f260853678922e03
- fred123 = 77064f5bd13e417f564e7d880dc7a536
- qwerty = d8578edf8458ce06fbc5bb76a58c5ca4
Qual a sugestão então?
Ao invés de gravar a senha apenas com MD5, utilize mais algum outro algoritmo de criptografia junto – como o SHA1.
Também faça uso de uma ou mais palavras como salt (para ‘salgar’/dificultar a quebra da senha) no início, no final ou até no meio da senha original do usuário.
Exemplo prático em PHP:
1 2 3 4 5 6 | <?php $senha_original = '123minhasenha456'; $salt1 = 'm30'; $salt2 = '$417'; $nova_senha_sha1 = sha1($senha_original); $nova_senha_md5_salted = md5($salt1 . $nova_senha_sha1 . $salt2); |
Comentários do código acima:
- Linha 2: definida uma senha relativamente fraca. Apesar de conter 16 caracteres e ser composta de letras e números, não é difícil de ser descoberta. Para o exemplo ela é útil, mas não recomendo seu uso real.
- Linha 3: definido o salt inicial.
- Linha 4: definido o salt final.
- Linha 5: definida a senha criptografada com SHA1.
- Linha 6: adicionamos o salt no início (m30) e no final ($417) da senha já criptografada com SHA1. Em seguida fazemos a criptografia dessa ‘composição’ utilizando o algoritmo MD5. Com isso temos um hash de outro hash (um hash MD5 de um hash SHA1 ‘salgado’).
O retorno de cada linha passo-a-passo:
- Linha 5: 9e025524e71b9c68a68735b8e2b7a4d68633b21e
- Linha 6: 125b89ace2c34a80cdaded6954738e1f
Após o código acima, a nova senha salva no banco de dados será: 125b89ace2c34a80cdaded6954738e1f.
Seria como se a senha original do usuário, ao invés de “123minhasenha456” fosse “9e025524e71b9c68a68735b8e2b7a4d68633b21e“, e esta ainda criptografada com MD5.
O exemplo é simples, e mostra de maneira rápida como reforçar a segurança das senhas salvas no seu banco de dados, e lembre-se: jamais as salve sem criptografia. Nevah!
Para fazer a comparação da senha inserida, basta convertê-la utilizando o mesmo algoritmo usado na hora do cadastro e comparar com a senha gravada no banco – ambas já convertidas/criptografadas.
Ainda tratando de segurança, neste sábado – 28 de Março de 2009, nosso amigo Er Galvão Abbott (leia: Diretor de Conteúdo da PHP Conference Brasil e fundador do UG PHPBR [site e lista de discussão]) ministrará seu renomado curso (3ª edição):
TOP 10 OWASP com PHP – Entendendo as 10 principais vulnerabilidades de aplicações web e como defender a sua aplicação
Onde dois dos temas abordados são justamente Vazamento de informações e Problemas de armazenamento criptografado.
Clique aqui para se inscrever ou aqui para maiores informações sobre o curso.