Lunes Apps

Criptografia: Como funciona | pt.1

Este é o primeiro artigo da série de Criptografia. Vamos ensinar o essencial da parte técnica para toda a comunidade entender como funciona.

Atenção: Esta é uma explicação mais aprofundada de segurança com criptografia Hash.

 

Teoria

Hash de senhas é sempre uma defesa secundária. Um servidor que faça autenticação precisa de alguma informação para poder validar uma senha. Um sistema simples armazena as próprias senhas literalmente, e a validação neste caso é mera comparação de strings. Neste caso, se alguém der uma mera espiada no arquivo da base de dados, já verá informação demais. Este tipo de brecha acontece na prática. Um backup em lugar errado, um HD trocado e não apagado corretamente, uma injeção SQL, e assim vai. Veja uma discussão detalhada neste blog.

 

Mesmo assim, como o conteúdo de um servidor que valide senhas necessariamente inclui os dados para esta validação, alguém que tenha mera cópia destes pode fazer um ataque de dicionário offline, tentando senhas em potencial até que alguma coincida, e este tipo de ataque é inevitável. E sendo assim o que podemos é tentar deixar este ataque o mais difícil possível, e para isto, temos estas ferramentas:

 

  • Funções criptográficas de hash: são funções matemáticas que ao mesmo tempo que são eficientes, ninguém sabe como reverter. O servidor pode manter um hash de uma senha; quando for fazer a comparação, basta usar o mesmo hash no segundo valor e ver se coincidem; de qualquer forma, olhando o hash não dá pra saber qual é a senha original.

 

  • Salts: uma das vantagens do atacante é o paralelismo. O atacante pega um monte de senhas protegidas com hash e quer descobrir o máximo que puder delas. Ele pode simplesmente fazer um hash de uma senha em potencial e comparar esse mesmo hash com centenas de registros diferentes. Pode também usar tabelas de hashes pré-calculadas, incluindo as rainbow tables;

 

  • A característica de ataques com paralelismo é atuar sobre várias senhas com a mesmíssima função de hash. Usar o salt não se trata de ter uma função de hash, mas uma porção delas. Idealmente cada senha deveria usar sua própria função de hash. Um salt é um modo de selecionar uma solução específica de hash entre uma grande família de funções. Se propriamente usado, pode acabar totalmente com o paralelismo.

 

  • Lentidão: computadores são cada vez mais rápidos, como teorizou Gordon Moore, co-fundador da Intel. Cérebros humanos não. A cada ano os atacantes podem testar mais e mais senhas no mesmo tempo, enquanto usuários não lembram senhas mais complexas (ou se recusam a lembrar). Para isso, podemos fazer com que hashes fiquem extremamente lentas usando funções que demandem muitas iterações.

 

Nós temos algumas funções criptográficas bem comuns, como MD5 e a família SHA. Construir uma função de hash usando operações elementares não é uma tarefa fácil. Quando criptógrafosquerem fazer isso, pensam profundamente, e organizam torneios onde as funções “brigam entre si violentamente”. Depois de centenas deles virando, mexendo, cutucando uma função por vários anos e não acham nada ruim pra falar dela, eles começam a admitir que, talvez, aquela função possa ser considerada mais ou menos segura. Foi o que aconteceu na competição SHA-3. Nós temos que usar este meio de construir estas funções por não conhecermos jeito melhor. Matematicamente não sabemos se funções seguras de hash realmente existem, o que temos são candidatas (esta é a diferença entre “não pode ser quebrada” e “ninguém sabe como quebrar”).

 

Uma função básica de hash, mesmo segura como função de hash não é apropriada para senhas, pelo seguinte:

  • não usa salt, permitindo ataques paralelos (rainbow tables pra MD5 e SHA-1 podem ser obtidas gratuitamente, você não precisa nem ter o trabalho de calcular);
  • são muito rápidas e ficam mais e mais com o tempo. Com uma GPU razoável de mercado, a taxa de hashing é de bilhões de senhas por segundo.

 

Então, precisamos de coisa melhor. E mais, juntar adequadamente uma função de hash, salt e ficar iterando, não é mais simples do que projetar uma função de hash — ao menos se você quiser um resultado seguro. Novamente você depende de construções padrão que sobreviveram ao massacre contínuo de criptógrafos vingativos.

 

Original text under license Creative Commons ShareAlike

 


 

 

Junte-se às nossas mídias sociais:

Facebook: https://goo.gl/4J5HDY

Twitter: https://goo.gl/a4o2G7

Telegram News: https://t.me/LunesNews

Telegram Inglês: https://goo.gl/1vjkDr

Telegram Espanhol: https://t.me/EspanolLunes

Telegram Francês: https://t.me/LunesFrancais

Telegram Português: https://goo.gl/y1qZfj

Discord: https://discord.gg/2zpywNW



Relacionados