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
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:
-
PBKDF2 tem um parâmetro “salt”, que pode ser usado para garantir que as saídas sejam exclusivas, mesmo se as senhas de entrada não forem . (Usar um sal também impede ataques baseados em pré-computação, uma vez que o invasor não pode começar a fazer hash da senha adivinhada antes de conhecer o sal.) SHA-512 por si só não tem o conceito de um sal, embora um efeito equivalente possa ser obtido. prefixando o salt à senha.
-
SHA-512 sempre produz uma saída de 512 bits (daí seu nome), embora você sempre possa truncá-la para um comprimento menor se você não precisa dos 512 bits completos. PBKDF2 pode, em princípio, produzir saída de qualquer comprimento, embora na prática use-o para gerar mais de uma saída hash interna equivalente bits não são recomendados .
*) 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.
PBKDF2(HMAC_SHA512, password, ...)
.