Função de derivação chave - Key derivation function

Na criptografia , uma função de derivação de chave ( KDF ) é uma função hash criptográfica que deriva uma ou mais chaves secretas de um valor secreto, como uma chave principal, uma senha ou uma frase secreta usando uma função pseudo - aleatória . KDFs podem ser usados ​​para esticar chaves em chaves mais longas ou para obter chaves de um formato necessário, como converter um elemento de grupo que é o resultado de uma troca de chave Diffie – Hellman em uma chave simétrica para uso com AES . Funções de hash criptográficas com chave são exemplos populares de funções pseudo-aleatórias usadas para derivação de chave.

Derivação chave

O uso original de um KDF é a derivação de chaves, a geração de chaves a partir de senhas ou frases secretas. As variações sobre este tema incluem:

  • Em conjunto com parâmetros não secretos para derivar uma ou mais chaves de um valor secreto comum (que às vezes também é referido como " diversificação de chave "). Tal uso pode impedir que um invasor que obtenha uma chave derivada aprenda informações úteis sobre o valor do segredo de entrada ou qualquer uma das outras chaves derivadas. Um KDF também pode ser usado para garantir que as chaves derivadas tenham outras propriedades desejáveis, como evitar "chaves fracas" em alguns sistemas de criptografia específicos.
  • Como componentes de protocolos de acordos de chave multipartidários . Exemplos de tais funções de derivação de chave incluem KDF1, definido em IEEE Std 1363-2000 , e funções semelhantes em ANSI X9.42.
  • Para derivar chaves de senhas ou frases secretas (um KDF baseado em senha ).
  • Para derivar chaves de comprimentos diferentes dos fornecidos: um exemplo de KDFs projetados para essa finalidade é o HKDF .
  • Alongamento e fortalecimento de teclas.

Alongamento e fortalecimento de teclas

As funções de derivação de chave também são usadas em aplicativos para derivar chaves de senhas ou frases secretas, que normalmente não têm as propriedades desejadas para serem usadas diretamente como chaves criptográficas. Em tais aplicações, é geralmente recomendado que a função de derivação de chave seja deliberadamente lenta, de modo a frustrar o ataque de força bruta ou o ataque de dicionário na senha ou no valor de entrada da frase secreta.

Esse uso pode ser expresso como DK = KDF (chave, sal, iterações) , onde DK é a chave derivada, KDF é a função de derivação da chave , a chave é a chave original ou senha, sal é um número aleatório que atua como sal criptográfico , e iterações refere-se ao número de iterações de uma subfunção. A chave derivada é usada em vez da chave ou senha original como a chave para o sistema. Os valores do salt e o número de iterações (se não for fixo) são armazenados com a senha em hash ou enviados como texto não criptografado (não criptografado) com uma mensagem criptografada.

A dificuldade de um ataque de força bruta aumenta com o número de iterações. Um limite prático na contagem de iterações é a relutância dos usuários em tolerar um atraso perceptível no login em um computador ou na visualização de uma mensagem descriptografada. O uso de salt impede que os invasores pré-computem um dicionário de chaves derivadas.

Uma abordagem alternativa, chamada de reforço da chave , estende a chave com um sal aleatório, mas então (ao contrário do alongamento da chave) exclui o sal com segurança. Isso força o invasor e os usuários legítimos a realizar uma busca de força bruta pelo valor de sal. Embora o artigo que introduziu o alongamento das teclas se referisse a essa técnica anterior e escolheu intencionalmente um nome diferente, o termo "reforço das teclas" é agora frequentemente (indiscutivelmente incorreto) usado para se referir ao alongamento das teclas.

Hash de senha

Apesar de seu uso original para derivação de chave, KDFs são possivelmente mais conhecidos por seu uso em hashing de senha ( verificação de senha por comparação de hash ), como usado pelo arquivo passwd ou arquivo de senha shadow . As funções de hash de senha devem ser relativamente caras para calcular no caso de ataques de força bruta, e o alongamento de chave de KDFs por acaso fornece essa característica. Os parâmetros não secretos são chamados de " sal " neste contexto.

Em 2013, uma competição de hash de senha foi anunciada para escolher um novo algoritmo padrão para hash de senha. Em 20 de julho de 2015, a competição terminou e Argon2 foi anunciado como o vencedor final. Quatro outros algoritmos receberam reconhecimento especial: Catena, Lyra2, Makwa e yescrypt.

História

A primeira função de derivação de chave baseada em senha deliberadamente lenta (extensão de chave) foi chamada de " crypt " (ou "crypt (3)" após sua página de manual ) e foi inventada por Robert Morris em 1978. Ela criptografaria uma constante (zero) , usando os primeiros 8 caracteres da senha do usuário como a chave, realizando 25 iterações de um algoritmo de criptografia DES modificado (em que um número de 12 bits lido do relógio do computador em tempo real é usado para perturbar os cálculos). O número de 64 bits resultante é codificado como 11 caracteres imprimíveis e, em seguida, armazenado no arquivo de senha Unix . Embora tenha sido um grande avanço na época, os aumentos nas velocidades do processador desde a era PDP-11 tornaram os ataques de força bruta contra criptas viáveis ​​e os avanços no armazenamento tornaram o sal de 12 bits inadequado. O design da função crypt também limita a senha do usuário a 8 caracteres, o que limita o keyspace e torna impossíveis as frases-senhas fortes .

Embora a alta taxa de transferência seja uma propriedade desejável em funções hash de uso geral, o oposto é verdadeiro em aplicativos de segurança de senha em que a defesa contra o cracking de força bruta é a principal preocupação. O uso crescente de hardware maciçamente paralelo, como GPUs, FPGAs e até ASICs para cracking de força bruta tornou a seleção de algoritmos adequados ainda mais crítica porque o bom algoritmo não deve apenas impor uma certa quantidade de custo computacional, não apenas em CPUs, mas também resistem às vantagens de custo / desempenho das plataformas massivamente paralelas modernas para tais tarefas. Vários algoritmos foram projetados especificamente para este propósito, incluindo bcrypt , scrypt e, mais recentemente, Lyra2 e Argon2 (este último foi o vencedor da Competição de Hashing de Senha ). A violação de dados em grande escala do Ashley Madison, na qual cerca de 36 milhões de hashes de senhas foram roubados por invasores, ilustrou a importância da seleção de algoritmos na proteção de senhas. Embora o bcrypt tenha sido empregado para proteger os hashes (tornando o cracking de força bruta em grande escala caro e demorado), uma parte significativa das contas nos dados comprometidos também continha um hash de senha baseado no algoritmo MD5 de uso geral rápido , que tornou é possível que mais de 11 milhões de senhas sejam quebradas em questão de semanas.

Em junho de 2017, o Instituto Nacional de Padrões e Tecnologia dos Estados Unidos (NIST) emitiu uma nova revisão de suas diretrizes de autenticação digital, NIST SP 800-63B-3, declarando que: "Os verificadores DEVEM armazenar segredos memorizados [ou seja, senhas] em um formulário que é resistente a ataques offline. Os segredos memorizados DEVEM ser salgados e hash usando uma função de derivação de chave unilateral adequada. As funções de derivação de chave usam uma senha, um sal e um fator de custo como entradas e, em seguida, geram um hash de senha. Sua finalidade é tornar cada tentativa de adivinhação de senha por um invasor que obteve um arquivo hash de senha cara e, portanto, o custo de um ataque de adivinhação alto ou proibitivo. "

As funções modernas de derivação de chave baseadas em senha, como PBKDF2 (especificado em RFC 2898), são baseadas em um hash criptográfico reconhecido, como SHA-2 , usam mais sal (pelo menos 64 bits e escolhidos aleatoriamente) e uma alta contagem de iteração. O NIST recomenda uma contagem de iteração mínima de 10.000. "Para chaves especialmente críticas, ou para sistemas muito poderosos ou sistemas onde o desempenho percebido pelo usuário não é crítico, uma contagem de iteração de 10.000.000 pode ser apropriada."

Referências

Leitura adicional