Na Coderockr, nós, eventualmente, nos deparamos com sistemas legados e muitas vezes inseguros. Um dos problemas mais comuns é a utilização de funções hash como MD5, SHA1, SHA-256 em senhas. O uso dessas funções apresenta alguns riscos que as aplicações não deveriam estar correndo, mas antes de abordar as soluções, vamos ver porque o uso deses algoritmos de hash representam um risco de segurança.
Basicamente, funções hash foram criadas para verificar a integridade de dados de forma eficiente e no menor tempo possível, sendo um grande problema quando estamos lidando com senhas, pois não fornecem nenhuma defesa contra ataques de força bruta.
Se você acha que isso não é algo tão importante ou não sabia disso, o Jeff Atwood fez um post bem detalhado sobre o assunto em 2012!
Senhas estão obsoletas há um bom tempo e podem/devem ser substituídas por mecanismos possivelmente mais seguros. Muitas empresas como Medium, Telegram, Instagram, Uber e WhatsApp já aderiram a essa prática.
Ficou com medo de fazer uma mudança tão grande? Bom, você deveria ficar com medo é de ser um dos responsáveis por garantir a segurança dessas informações!
Embora essa opção possa dar trabalho para se utilizar em projetos que já estejam em produção, é possivelmente mais econômico utilizar serviços de terceiros ao invés de manter uma solução você mesmo.
Auth0 — A Auth0 é uma empresa que provê diversos produtos e serviço relacionados a autenticação e autorização e facilitam muito a sua vida com segurança;
Keycloak — O Keycloak é um sistema open source para gerenciamento de acesso e usuários, é o melhor identity provider open source que eu já encontrei e é mantido pela Redhat;
Account Kit — O Account Kit é um produto do Facebook para prover registro e login de usuários através de SMS ou e-mail, sem a necessidade de senhas e com o foco principal em aplicativos mobile.
Existem algumas abordagens utilizadas para migrar as senhas, por exemplo, podemos forçar todos os usuários a recuperarem as senhas e utilizar o novo algoritmo quando a nova senha for utilizada – embora está opção não seja recomendável.
Outra opção é ir utilizando o novo algoritmo nos novos usuários e nos usuários antigos, conforme eles forem logando. Mas essa solução é ruim, pois os usuários inativos continuarão com hashes inseguros, se acontecer um vazamento da sua base de dados. Podemos resolver isso removendo a senha de usuários que não se logam há muito tempo.
Para mim, a melhor solução nesse caso é uma abordagem um pouco diferente. Vamos utilizar o resultado do hash antigo como entrada para o novo algoritmo de senhas; dessa forma, precisamos apenas fazer a migração dos hashes antigos para o novo e os usuários não irão perceber!
Se você ficou interessado nessa abordagem, o pessoal da Paragon Initiative possui um artigo bem detalhado sobre essa prática e quais algoritmos de password hash devem ser utilizados.