É comum encontrar na internet cursos de PHP e MySQL que incentivam a utilização da função md5 como opção viável para a criptografia de senhas. Na maioria dos casos, o instrutor sabe que isso não deve ser feito em ambientes de produção (quando o seu site está no ar, funcionando) mas o faz como medida educacional para simplificar o entendimento do conceito final: senhas devem ser criptografadas antes de serem salvas (no caso de um vazamento ou hack os atacantes não consigam visualizá-las).
Ok. Mas por que não usar o MD5, se ele cumpre essa função?
MD5 é rápido demais
Ué, mas isso não é bom? Nesse caso não. O motivo é que ao mesmo tempo que você consegue criptografar uma string rapidamente, os hackers também. Logo, um ataque de força bruta pode calcular milhões de combinações possíveis e tentar cada uma até acertar.
MD5 não é collision-resistant
Resumindo: é possível que duas strings diferentes produzam o mesmo hash md5. Se você tem, por exemplo, um certificado SSL assim criptografado, alguém poderia criar uma cópia com conteúdo diferente e injetá-la na sua aplicação.
Existem vários bancos de dados de senhas MD5 na internet
Uma pesquisa no Google usando o termo “md5 decrypt” vai te levar à milhares de sites (como esse) onde você digita uma hash md5 e eles te dizem qual a palavra que a produziu. Ou seja, você não precisa ser um grande especialista pra quebrar a segurança.
Quando usar MD5?
Isso depende muito do tipo de aplicação que você costuma construir, mas na maioria dos casos, a melhor aplicação da criptografia MD5 é na verificação da integridade de arquivos.
Exemplo: sua aplicação precisa enviar um arquivo dividido em várias partes de um servidor para o outro. Depois de juntar as partes do arquivo no novo hospedeiro, como saber se nenhuma parte está faltando ou foi alterada no caminho? Bom, se o arquivo original criptografado produz a mesma hash md5 que o novo arquivo Frankenstein, então eles são iguais. Simples assim!
Se não md5, o que usar então?
Bom, gravei um vídeo tutorial explicando o passo a passo de como criptografar senhas de maneira segura usando PHP. Segue: