Pular para o conteúdo
Todos os conceitos

O sal

Um valor diferente por conta, somado à senha antes do hash, para que senhas iguais não virem hashes iguais.

Sem sal, a mesma senha vira sempre o mesmo hash. Duas pessoas que escolheram pampa123 ficam com linhas idênticas no banco:

diretoria,ebe4de26dd22577bf32eb3fd56fc39f6
caixa02,ebe4de26dd22577bf32eb3fd56fc39f6

Isso tem dois problemas. O reúso de senha fica à vista (hashes iguais, senha igual), e o atacante calcula o hash de uma lista de senhas uma vez e compara com o banco inteiro de uma vez só.

O sal conserta os dois. É um valor diferente para cada conta, em geral aleatório, somado à senha antes de calcular o hash e guardado ao lado do resultado. Aí a mesma senha, com sais diferentes, vira hashes diferentes:

diretoria,sal=9f3a,hash=...a1
caixa02,sal=1c7e,hash=...b8
sem sal ana pampa a1b2c3d4 léo pampa a1b2c3d4 hashes iguais: reúso à vista com sal ana pampa + sal 9f3a 77de10b2 léo pampa + sal 1c7e b4a8c90f hashes diferentes
Sem sal, a mesma senha dá o mesmo hash, e o reúso aparece; com um sal por conta, a mesma senha dá hashes diferentes, e some o padrão.

O sal não é segredo (ele fica guardado junto), e sozinho não deixa o hash mais lento. O que ele faz é tirar o atalho: o atacante tem de atacar cada conta separadamente, e tabelas pré-calculadas deixam de servir. Por isso os esquemas bons já trazem o sal embutido, como o bcrypt e o Argon2, e em Python o hashlib.pbkdf2_hmac('sha256', senha, sal, 200000) junta o sal e ainda repete o hash milhares de vezes.

Aparece nestes desafios