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'.

Imagem

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árioSenha
joao7C222FB2927D828AF22F592134E8932480637C0D
mariaA7D579BA76398070EAE654C30FF153A4C273272A
jose4A3487E57D90E2084654B6D23937E75AF5C8EE55
bruno7C222FB2927D828AF22F592134E8932480637C0D
dianaA7D579BA76398070EAE654C30FF153A4C273272A

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 AttackBrute Force Attack
Tentando 1234578 : falhouTentando aaaa : falhou
Tentando 10203040 : falhouTentando aaab : falhou
Tentando meucachorro : falhouTentando aaac : falhou
......
Tentando minhamae : falhouTentando 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

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.

Referências