Senhas salgadas

Eu sou do mundo PHP, onde encontrar sistemas que mantém nossas senhas abertas ao mundo no banco de dados é quase lugar comum. Quando algum programador um pouquinho mais ajuizado passava pela equipe as vezes eu encontrava um md5(‘senha’); no meio do caminho. Isso melhorava a situação, mas ainda deixava muito a desejar. Em rails o pessoal costuma usar SHA1, que apesar de mais avançado que md5, possui uma vulnerabilidade comum a todos os sistemas de criptografica simples: as Rainbow Tables.

[Quem quiser saber o que são e como funcionam as rainbow tables, eu aconselho uma olhadinha na wikipedia , e nesse blog .]

Existe uma forma bem simples de se contornar isso. E ela não é nada nova, segundo esse especialista essa implementação existe dentro do Unix desde 1976!

Qual é a grande sacada?
A idéia é adicionar uma string aleatória à senha antes de criptografá-la e salvá-la no banco de dados. Essa string costuma ser chamada de ‘salt’ (sal, em português) e apesar de não impossibilitar completamente o uso das rainbow tables, torna-o difícil o suficiente para garantir seu sono.

“Salgando” models
Eu retirei o código a seguir do livro do DHH que eu citei antes, foi o exemplo mais simples e fácil de entender que eu achei.

Criando o salt
def create_new_salt
    self.salt = self.object_id.to_s + rand.to_s
end

Nesse exemplo usamos o id do objeto mais uma string aleatória para gerar o nosso sal. Qualquer coisa vale aqui. Com o salt em mãos, basta criptografar a senha usando ele e salvar ambos (a senha criptografada e o salt limpo) no banco.

Para retornar a senha utilize
def self.encrypted_password(password, salt)
    string_to_hash = password + "wibble" + salt # 'wibble makes it harder to guess
    Digest::SHA1.hexdigest(string_to_hash)
end
Aquele “wibble” ali no meio também pode ser qualquer coisa, ele aumenta “um pouquinho” a dificuldade de um ataque ser bem sucedido.

Essa solução é extremamente simples, tanto que ela é apresentada em um dos livros mais “hands-on” de rails que existem, mesmo assim eu ainda sou surpreendido todos os dias ao saber que “sistema X ou Y” ainda usa md5 puro para criptografia, isso quando usam alguma coisa.

Vamos cuidar mais da segurança dos nossos usuários ;)

Leave a Reply