Lunes Apps

Criptografia: Como funciona | pt.2

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

Funções de hash boas para senhas

 

PBKDF2

O PBKDF2 vem da PKCS#5. É parametrizado com contador de iterações que iniciando por 1 e não tem limite superior, um salt arbitrário sem restrição de tamanho, e o tamanho requerido de saída. (O PBKDF2 gera uma saída de tamanho configurável), e um PRF. Na prática o PBKDF2 é sempre usado com HMAC, que é construído por sua vez sobre uma função de hash também. Quando dizemos “PBKDF2 com SHA-1”, na verdade significa “PBKDF2 com HMAC com SHA-1”.

 

Vantagens:

  • Já foi definido há bastante tempo, e ainda está “ileso”.
  • Já está presente em vários frameworks (como .NET, por exemplo).
  • Altamente configurável (apesar de algumas implementações não permitirem a escolha do hash, como o .NET que usa apenas SHA-1).
  • Aprovado pelo NIST (observar a diferença entre hashing e derivação de chave; leia a seguir).
  • Tamanho de saída configurável (leia a seguir).

 

Desvantagens:

  • É intensivo somente pra CPU, e bem mais acessível para a GPU (o servidor é um pc normal usualmente, para tarefas usuais, enquanto o atacante pode investir mais em hardware especializado e ter vantagem com isso).
  • Você tem que ajustar os parâmetros por sua conta (gerar e gerenciar o salt, número de iterações etc). Há um encoding padrão para os parâmetros do PBKDF2 mas ele usa ASN.1, então as pessoas evitam sempre que podem (ASN.1 é complicado para não-experts).

 

bcrypt

O bcrypt foi desenvolvido reusando e expandindo elementos de um block cipher chamado Blowfish. A contagem de iterações é uma potência de dois, que é bem menos configurável que a da PBKDF2, mas suficiente pro uso normal. Esse é o núcleo do mecanismo de hash de senhas do OpenBSD.

 

Vantagens:

  • Implementação disponível para várias linguagens (veja os links no rodapé da página da Wikipedia)
  • Mais “resistente” à GPU; isso graças a detalhes do seu design interno. Os autores do bcrypt fizeram desta forma voluntariamente. Reusaram o Blowfish por este ser baseado numa tabela RAM interna que é constantemente modificada durante o processamento. Isso complica muito a vida de quem quiser acelerar o bcrypt com GPUs, pois GPUs não são boas para acessar memória em paralelo.
  • A saída padrão inclui o salt e contagem de iterações, simplificando em muito a armazenagem, que é de apenas uma string.

 

Desvantagens:

  • Tamanho fixo de saída: 192 bits.
  • Apesar de forçar as GPUs, pode ser otimizado com FPGA: Chips FPGA modernos têm blocos embutidos de RAM que são bem convenientes para rodar bcrypt em paralelo no mesmo chip. Já foi feito, inclusive.
  • A senha de entrada é limitada a 51 caracteres. Para senhas maiores, alguém teria que combinar o bcrypt com uma função de hash (calcula o hash da senha, e usa o resultado com bcrypt). Combinar primitivos criptográficos tem riscos, então isto não é recomendado para uso geral.

 

scrypt

O scrypt é bem mais novo (projetado em 2009), baseado no PBKDF2 e num stream cipherchamado Salsa20/8. De qualquer forma, estas são apenas ferramentas em torno do núcleo que concentra a força do scrypt, que é a RAM. O scrypt foi feito de forma a usar muita RAM (ele gera alguns bytes pseudo-aleatórios, e os lê repetidamente, numa sequência também pseudo-aleatória). “Muita RAM” é algo difícil de paralelizar. Um PC básico é bom no acesso à RAM, e normalmente não vai tentar ler simultaneamente da RAM dezenas de bytes sem relação aparente. Um atacante com GPU ou FPGA pode querer fazer isso, mas terá dificuldade.

 

Vantagens:

  • Um PC, ou seja, o que o defensor vai usar pra aplicar o hash normalmente, é uma das melhores (senão a melhor) plataforma para operar o scrypt. O atacante não tem mais vantagem investindo em GPU ou FPGA.
  • Uma opção a mais de ajuste: uso de memória.

 

Desvantagens:

  • É novo ainda (minha “regra pessoal” é de aguardar ao menos 5 anos de exposição — mas, é claro, é bom que outras pessoas usem o scrypt em produção, para dar maior visibilidade).
  • Não tem tantas implementações à disposição para as diversas linguagens.
  • Não está claro qual o ideal de CPU e RAM a usar. Pra cada acesso pseudo-aleatório o scrypt precisa computar um hash, um cache miss gasta 200 ciclos, uma chamada de SHA-256 gasta 1000. Há espaço para melhorias nesse aspecto.
  • Uma opção a mais para ajustar: quanta memória usar.

 

Iterated And Salted S2K do OpenPGP

Estou mencionando este, pois você vai usar se for proteger arquivos com senha usando GnuPG. Essa ferramente segue o formato OpenPGP, que define suas próprias funções de hash, chamadas “Simple S2K”, “Salted S2K” e “Iterated and Salted S2K“. Apenas a terceira pode ser considerada “boa” no contexto desta resposta. É definida como uma hash de uma string longa (configurável até uns 65 megabytes) e consiste em repetição de um salt de 8 bytes e a senha.

 

Em linhas gerais, O “Iterated And Salted S2K” do OpenPGP é decente, similar a um PBKDF2 com menos opções. Você raramente vai encontrar essa implementação fora do OpenPGP.

 

“crypt” do Unix

Sistemas do tipo Unix atuais (como Linux), usam variantes iteradas e com salt da função crypt(), que é baseada em boas funções de hash, com milhares de iterações. Isso é razoavelmente bom. Alguns sistemas também podem usar bcrypt, que é melhor ainda.

 

A função crypt() “antiga”, que era baseada no block cipher DES, não é boa:

  • É lenta em software, mas rápida em hardware, e ainda pode ser acelerada em software quando computando várias instâncias em paralelo (técnica conhecida como SWAR ou “bitslicing”), que é vantajoso para o atacante.
  • Ainda é muito rápida com 25 iterações.
  • Seu salt é de 12 bits, implicando em reúso frequente.
  • Trunca a senha a 8 caracteres e ainda trunca o bit alto, transformando em ASCII puro (7 bits).

 

As variantes novas, que são as que estão em uso atualmente, são OK.

 

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