Segurança em Aplicações Web

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.

This entry was posted in Artigos and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">