Ah, o sal! Aquele pozinho mágico no hashing que parece feitiçaria quando você não entende bem o motivo, mas pelo menos é mais complicado que a salada de termos dos novatos. Ele é essencial para deixar o processo de hashing mais intrincado, enquanto a senha do usuário continua tipo '123456'.
O Hash
Essa função determinística nem sempre é explicada detalhadamente. Quer uma dica fácil? Pegue uma entrada, passe na função hash, e pronto: uma saída sempre igual. Mas, para garantir que nenhum hash acabe igual, adicionamos o sal, complicando ainda mais a vida dos hackers.
Entendendo o problema
Imagine nosso amigo usuário com a super senha 12345678. O hash dela com MD5 seria 25D55AD283AA400AF464C76D713C07AD. A tabela abaixo mostra que, nos hashes, usuários diferentes podem acabar com o mesmo hash e, consequentemente, a mesma senha.
Usuário | Senha |
---|---|
joao | 7C222FB2927D828AF22F592134E8932480637C0D |
maria | A7D579BA76398070EAE654C30FF153A4C273272A |
jose | 4A3487E57D90E2084654B6D23937E75AF5C8EE55 |
bruno | 7C222FB2927D828AF22F592134E8932480637C0D |
diana | A7D579BA76398070EAE654C30FF153A4C273272A |
Quando bruno e joão têm o mesmo hash, adivinha? A mesma senha! E se você acha isso um grande problema de segurança, parabéns, está no caminho certo para entender.
Antes de continuar, revise o que já foi visto
As partes anteriores que falam sobre segurança podem relembrar pontos importantes:
Como hashes são quebrados
Os ataques a hashes não são para qualquer um, mas quem souber desses métodos pode tentar:
- Dictionary attack
- Brute Force attack
- Lookup Table
- Reverse Lookup Table
- Rainbow Tables
O sal estraga logo três deles: Lookup table, reverse lookup, e rainbow table, mostrando que até uma pequena pitada de sal faz estrago.
Dictionary e Brute force attack
São tentativas de adivinhar uma senha tentando várias combinações:
Dictionary Attack | Brute Force Attack |
---|---|
Tentando 1234578 : falhou | Tentando aaaa : falhou |
Tentando 10203040 : falhou | Tentando aaab : falhou |
Tentando meucachorro : falhou | Tentando aaac : falhou |
... | ... |
Tentando minhamae : falhou | Tentando zzab : falhou |
Tentando minhasenhasecreta: sucesso! | Tentando zzac : sucesso! |
O brute force é mais demorado, enquanto o dictionary procura qualquer palavra comum. O problema? Existem dicionários prontos só esperando as senhas serem usadas.
Lookup table
Uma tabela pré-calculada pode ser uma solução prática para a preguiça.
Procurando: 7C222FB2927D828AF22F592134E8932480637C0D: ENCONTRADO: 12345678
Procurando: 040069E821AF22F61491D2040C481C97: não no banco de dados
Procurando: A7D579BA76398070EAE654C30FF153A4C273272A: ENCONTRADO: 10203040
Procurando: 6E22255F7B6C604A2992FF97E1F5B2CA: não no banco de dados
Procurando: 65CC61F8A26C3480CA3C6714D67BBC3F: ENCONTRADO: minhamae
Procurando: BCD3A64ED1C945565F54FFFBA26071E9: ENCONTRADO: minhasupersenha
Procurando: F5BB0C8DE146C67B44BABBF4E6584CC0: não no banco de dados
Procurando: D017FBF96868A24E9E144E7BF4B2260D: não no banco de dados
Reverse Lookup table
É o jeito de generalizar problemas e atingir muitos usuários. Assim:
Buscando hash(12345678) nos usuários... : Combina [joao, bruno, ricardo]
Buscando hash(10203040) nos usuários... : Combina [jose, aaamaria, diana]
Buscando hash(minhasenhasecreta) nos usuários... : Combina [wilson, lula, moro]
Buscando hash(@Password1) nos usuários... : Combina [mario, manoel, dilma]
Buscando hash(@pass1) nos usuários... : Nenhum usuário usou essa senha
Rainbow table
As Rainbow tables são como o cavaleiro hacker tentando dominar tudo. Esse método une "hash" e "redução" para criar uma corrente sem fim, economizando memória, mas levando tempo.
Sal
Para quem acha que Lookup tables e Rainbow tables são complicadas, o sal é o herói improvável. Cada hash se transforma em uma experiência única e aleatória.
MD5: 12345678 = 25D55AD283AA400AF464C76D713C07AD
MD5: 12345678 + B5dk6s93wu = DED4A56E0FC17B4FA7C6A0B160EF6383
MD5: 12345678 + vEO6GHigtl = E13BE10696873EAEC198328FB071D445
MD5: 12345678 + L7PKlspdH1 = C18B0EE74EDE5567EE5CA3CF9227DE4A
MD5: 12345678 + cKpCYq4P5J = E9458986AAB6554D449C4C310EFF0C2B
Você não precisa esconder o sal. Ele é público, mas ainda assim aumenta a segurança.
Não crie seu próprio sal
Quer causar problemas? Tente inventar seu próprio sal. Vai dar errado, confie.
Sal ineficaz
Acredita que um único sal vai te proteger? Revise suas expectativas. É só uma invisibilidade com buracos.
Playground
Teste você mesmo! Veja como os IDs são destruídos em uma Lookup table, fugindo de um tornado de bits. Experimente neste site:
670F8574BD93DD78BD568DAB84C6733A
25D55AD283AA400AF464C76D713C07AD
7C222FB2927D828AF22F592134E8932480637C0D
61FF76C0A46C9F653F4B1EE3D251AAC860263E15
2A6D337010BFD13831EB441CD9FB763D
Conclusão
Se você ainda não perdeu a paciência, entenda que um sal e aquele hash do início são suas defesas enquanto as senhas estão a salvo. Hackers vão tentar e você precisa estar pronto para evitar problemas.
A segurança não é só software ou rede: é proteger seus usuários. Não invente autenticações sozinho. Lembre-se, não subestime suas responsabilidades ou a motivação de um hacker.
Se ainda não revisou seu código, o bom senso agradece. Fim de mais um episódio, até a próxima.