Qual ' sa diferença entre PBKDF e SHA e por que usá-los juntos?

Tenho lido um pouco sobre hash recentemente e de acordo com AgileBits , eles usam “ SHA512 dentro de PBKDF2 ” em seu novo arquivo de vault.

Eu olhei na Wikipedia por ambos os nomes e eu sei que PBKDF2 é uma função de derivação chave e SHA é um criptográfico função hash, mas não consigo entender a diferença e por que eles são usados juntos um dentro do outro.

Alguém pode explicar isso para uma pessoa sem experiência em criptografia?

(Você pode presumir que eu só conheço matemática, se necessário).

Comentários

  • PBKDF2 é projetado muito mais lento do que SHA, então é melhor adequado para hash de senhas porque leva muito mais tempo para fazer um dicionário ou ataque de força bruta.
  • @puzzlepalace então eles fazem basicamente o mesmo e usam a composição PBKDF2 (SHA (senha)) então leva mais tempo para atacantes?
  • Bem, na maioria dos casos, PBKDF2 usa um primitivo chamado HMAC como uma função psuedo-aleatória, que por sua vez usa uma função hash criptográfica nos ‘ internos, em neste caso SHA512. Portanto, a composição realmente se parece mais com PBKDF2(HMAC_SHA512, password, ...).
  • PBKDF2 é o carro, HMAC é o motor, SHA512 é o pistão
  • Este último parte da minha resposta a uma pergunta anterior também aborda isso.

Resposta

SHA-512 é um hash criptograficamente seguro , PBKDF2 é o que chamamos de função de derivação de chave baseada em senha. Se o segredo resultante não for usado como chave, mas como valor de hash, também é chamado de hash de senha . Os hashes de senha diferem dos hashes seguros no sentido de que contêm um salt e um fator de trabalho / contagem de iteração.

Os hashes criptográficos e os hashes de senha são funções unilaterais projetadas para criar uma saída curta e de tamanho fixo de um dada entrada. No caso do hash de senha, a entrada seria a senha e o sal. O tamanho do salt e a contagem de iteração são comumente considerados parâmetros de configuração; é claro que ambos influenciam a saída do hash da senha.

Os hashes de senha geralmente são construídos sobre funções pseudo-aleatórias ou PRFs. Uma forma usual de PRF é um código de autenticação de mensagem baseado em HMAC ou Hash, que por sua vez usa um hash internamente. Quando PRFs baseados em hash, como HMAC, são usados, o tipo / tamanho de hash usado geralmente é configurável. Hashes de senha, entretanto, não precisam de ser compilados usando hashes. Qualquer outro PRF, como os baseados em cifras simétricas, pode servir. bcrypt, por exemplo, é construído sobre Blowfish, uma cifra de bloco.

Os hashes de senha precisam de um sal para que senhas idênticas não sejam mapeadas para o mesmo hash. Portanto, eles também evitam tabelas de arco-íris (contendo senhas pré-calculadas / pares de hash) de serem úteis. Além disso, eles contêm um fator de trabalho / contagem de iteração para que um invasor precise realizar mais trabalho para calcular o hash de cada senha possível. Isso é necessário porque a maioria das senhas não são aleatórias o suficiente. Sem o fator de trabalho, o invasor seria capaz de testar uma grande quantidade de senhas possíveis usando força bruta ou um ataque de dicionário.

Comentários

  • muito mais informações aqui … não ‘ não cabe no espaço de resposta.

Resposta

Para parafrasear minha resposta a uma pergunta anterior , PBKDF2 é um algoritmo genérico de alto nível que chama internamente uma função pseudo-aleatória (PRF) para processar sua entrada. A especificação PBKDF2 não exige nenhum PRF em particular, então os implementadores são livres para escolher qualquer PRF que desejarem (desde que atenda à definição de um PRF seguro e possam aceitar a entrada fornecida pelo PBKDF2).

Por acaso, de longe a escolha mais comum de PRF para PBKDF2 é HMAC , que é outra construção de alto nível que usa internamente uma função hash criptográfica . Novamente, a especificação do HMAC não exige nenhuma função hash em particular, * portanto, os implementadores são livres para escolher qualquer hash que desejarem. Provavelmente, a escolha mais comum hoje é um da família de hashes SHA-2 , que inclui SHA-256 e SHA-512.

Portanto, “SHA512 dentro de PBKDF2” quase certamente significa que eles “estão usando PBKDF2 com HMAC como PRF e com SHA-512 como o hash dentro de HMAC. **

O que pode ser confuso é que, em um de relance, este PBKDF2-com-HMAC-com-SHA512 pode parecer que está fazendo algo muito semelhante ao SHA-512: ambos pegam uma senha arbitrária como entrada e a transformam em uma string de bits pseudo-aleatória a partir da qual a senha original não pode ser facilmente reconstruído.No entanto, existem várias diferenças, sendo as mais importantes que:

  • SHA-512 é rápido. Muito rápido. PBKDF2 é deliberadamente lento para calcular e sua lentidão pode ser controlada ajustando o parâmetro de contagem de iteração.

  • Como uma consequência direta de sua velocidade, SHA -512 sozinho é vulnerável a ataques de força bruta de adivinhação de senha usando software como hashcat , que simplesmente gera muitas senhas e faz o hash até encontrar uma que produza um hash correspondente . Uma única CPU moderna pode facilmente fazer hash de milhões de senhas por segundo, e as GPUs são ainda mais rápidas.

Além disso, existem algumas outras pequenas diferenças com a observação:


*) A definição original do HMAC e as provas de segurança assumem efetivamente que a função hash usada é de um determinado tipo conhecido como função de hash Merkle – Damgård . Na verdade, todas as funções de hash criptográficas mais populares nas últimas décadas, incluindo a família SHA-2, foram desse tipo, portanto, essa limitação não tem sido um grande problema na prática. Isso pode estar mudando gradualmente com a padronização de SHA-3 (também conhecido como Keccak), que não um hash Merkle-Damgård, mas convenientemente, vem com sua própria declaração de segurança para HMAC-SHA3 .

**) Isso é uma multa e escolha tradicional, na medida em que vai. Não é tão resistente a ataques baseados em GPU e outros ataques paralelos quanto os KDFs mais modernos, como scrypt ou Argon2 seria, mas ainda é muito melhor do que o simples hash não iterado. Dito isso, para avaliar adequadamente sua segurança, também precisaríamos saber a contagem de iterações usada para PBKDF2. Infelizmente, muitas implementações de PBKDF2 tendem a usar o antigo “mínimo recomendado” de 1000 iterações, o que é pouco mais que um redutor de velocidade hoje em dia. Pessoalmente, em uma CPU moderna, eu preferiria algo próximo a 1.000.000 ou 1.000.000.000 de iterações .

Comentários

  • Pergunta: O PBKDF2 é usado apenas para diminuir o número de suposições (se for força bruta)? Ou há outras especificações para se manter em mente?
  • @NaveenNiraula : Além de desacelerar a suposição de força bruta, PBKDF2 tem o objetivo secundário de converter senhas de comprimento e formato arbitrários em bitstrings uniformemente pseudo-aleatórios. Mas apenas o hash simples pode fazer isso também. Além disso, o parâmetro salt permite derivar várias chaves distintas do mesmo senha e evita alguns ataques usando dicionários pré-computados como ” tabelas de arco-íris “. Mas, novamente, se você não o fez ‘ t precisa da proteção de adivinhação de força bruta de PBKDF2, você pode apenas usar HMAC simples para isso, ou mesmo apenas concatenar o salt com a senha antes de fazer o hash isso.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *