Função hash criptográfica - Cryptographic hash function

Algoritmos Hash seguros
Conceitos
funções hash  · SHA  · DSA
Padrões principais
SHA-0  · SHA-1  · SHA-2  · SHA-3
Uma função hash criptográfica (especificamente SHA-1 ) em funcionamento. Uma pequena mudança na entrada (na palavra "over") altera drasticamente a saída (resumo). Este é o chamado efeito de avalanche .

Uma função hash criptográfica ( CHF ) é um algoritmo matemático que mapeia dados de tamanho arbitrário (geralmente chamado de "mensagem") para uma matriz de bits de tamanho fixo (o "valor hash", "hash" ou "resumo da mensagem" ) É uma função unilateral , ou seja, uma função para a qual é praticamente inviável inverter ou reverter o cálculo. Idealmente, a única maneira de encontrar uma mensagem que produza um determinado hash é tentar uma pesquisa de força bruta de possíveis entradas para ver se elas produzem uma correspondência ou usar uma tabela arco - íris de hashes correspondentes. As funções de hash criptográficas são uma ferramenta básica da criptografia moderna.

A função de hash criptográfica ideal tem as seguintes propriedades principais:

  • é determinístico , o que significa que a mesma mensagem sempre resulta no mesmo hash
  • é rápido calcular o valor hash para qualquer mensagem dada
  • é inviável gerar uma mensagem que produza um determinado valor de hash (ou seja, para reverter o processo também é conhecido que gerou o dado valor de hash)
  • é inviável encontrar duas mensagens diferentes com o mesmo valor hash
  • uma pequena mudança em uma mensagem deve alterar o valor de hash tão extensivamente que um novo valor de hash apareça não correlacionado com o valor de hash antigo ( efeito de avalanche )

As funções criptográficas de hash têm muitas aplicações de segurança da informação , principalmente em assinaturas digitais , códigos de autenticação de mensagens (MACs) e outras formas de autenticação . Eles também podem ser usados ​​como funções hash comuns , para indexar dados em tabelas hash , para impressão digital , para detectar dados duplicados ou identificar arquivos de forma exclusiva e como somas de verificação para detectar corrupção acidental de dados. De fato, em contextos de segurança da informação, os valores criptográficos de hash às vezes são chamados de impressões digitais ( digitais ) , checksums ou apenas valores de hash , embora todos esses termos representem funções mais gerais com propriedades e propósitos bastante diferentes.

Propriedades

A maioria das funções de hash criptográficas são projetadas para receber uma string de qualquer comprimento como entrada e produzir um valor de hash de comprimento fixo.

Uma função hash criptográfica deve ser capaz de resistir a todos os tipos conhecidos de ataque criptanalítico . Na criptografia teórica, o nível de segurança de uma função hash criptográfica foi definido usando as seguintes propriedades:

Resistência pré-imagem
Dado um valor hash h , deve ser difícil encontrar qualquer mensagem m tal que h = hash ( m ) . Este conceito está relacionado ao de uma função unilateral . As funções que não possuem essa propriedade são vulneráveis ​​a ataques de pré - imagem .
Resistência da segunda pré-imagem
Dada uma entrada m 1 , deve ser difícil encontrar uma entrada diferente m 2 tal que hash ( m 1 ) = hash ( m 2 ) . Essa propriedade às vezes é chamada de resistência à colisão fraca . As funções que não possuem essa propriedade são vulneráveis ​​a ataques de segunda pré-imagem .
Resistência à colisão
Deve ser difícil encontrar duas mensagens diferentes m 1 e m 2 tais que hash ( m 1 ) = hash ( m 2 ) . Esse par é chamado de colisão de hash criptográfico . Essa propriedade às vezes é chamada de forte resistência à colisão . Ele requer um valor de hash pelo menos duas vezes mais longo do que o necessário para a resistência da pré-imagem; caso contrário, as colisões podem ser encontradas por um ataque de aniversário .

A resistência à colisão implica na resistência da segunda pré-imagem, mas não implica na resistência da pré-imagem. A suposição mais fraca é sempre preferida na criptografia teórica, mas na prática, uma função hash que é resistente apenas à segunda pré-imagem é considerada insegura e, portanto, não é recomendada para aplicações reais.

Informalmente, essas propriedades significam que um adversário mal - intencionado não pode substituir ou modificar os dados de entrada sem alterar seu resumo. Portanto, se duas strings têm o mesmo resumo, pode-se ter certeza de que são idênticas. A resistência da segunda pré-imagem impede que um invasor elabore um documento com o mesmo hash de um documento que o invasor não pode controlar. A resistência à colisão impede que um invasor crie dois documentos distintos com o mesmo hash.

Uma função que atenda a esses critérios ainda pode ter propriedades indesejáveis. Atualmente, funções de hash criptográficas populares são vulneráveis ​​a ataques de extensão de comprimento : dado hash ( m ) e len ( m ), mas não m , ao escolher um m adequado um invasor pode calcular o hash ( mm ) , onde ∥ denota concatenação . Esta propriedade pode ser usada para quebrar esquemas de autenticação ingênuos com base em funções hash. A construção do HMAC contorna esses problemas.

Na prática, a resistência à colisão é insuficiente para muitos usos práticos. Além da resistência à colisão, deve ser impossível para um adversário encontrar duas mensagens com resumos substancialmente semelhantes; ou para inferir qualquer informação útil sobre os dados, dado apenas seu resumo. Em particular, uma função hash deve se comportar tanto quanto possível como uma função aleatória (muitas vezes chamada de oráculo aleatório em provas de segurança), embora ainda seja determinística e computável de forma eficiente. Isso exclui funções como a função SWIFFT , que pode ser rigorosamente comprovada como resistente a colisões, assumindo que certos problemas em redes ideais são computacionalmente difíceis, mas, como uma função linear, não satisfaz essas propriedades adicionais.

Algoritmos de soma de verificação, como CRC32 e outras verificações de redundância cíclica , são projetados para atender a requisitos muito mais fracos e geralmente são inadequados como funções de hash criptográficas. Por exemplo, um CRC foi usado para integridade de mensagem no padrão de criptografia WEP , mas um ataque foi prontamente descoberto, que explorou a linearidade da soma de verificação.

Grau de dificuldade

Na prática criptográfica, "difícil" geralmente significa "quase certamente fora do alcance de qualquer adversário que deve ser impedido de quebrar o sistema enquanto a segurança do sistema for considerada importante". O significado do termo é, portanto, um tanto dependente do aplicativo, uma vez que o esforço que um agente malicioso pode colocar na tarefa é geralmente proporcional ao ganho esperado. No entanto, como o esforço necessário geralmente se multiplica com o comprimento do resumo, mesmo uma vantagem mil vezes maior no poder de processamento pode ser neutralizada adicionando-se algumas dezenas de bits ao último.

Para mensagens selecionadas de um conjunto limitado de mensagens, por exemplo, senhas ou outras mensagens curtas, pode ser viável inverter um hash tentando todas as mensagens possíveis no conjunto. Como as funções de hash criptográficas são normalmente projetadas para serem calculadas rapidamente, foram desenvolvidas funções de derivação de chave especiais que requerem maiores recursos de computação, o que torna esses ataques de força bruta mais difíceis.

Em algumas análises teóricas, "difícil" tem um significado matemático específico, como "não solucionável em tempo polinomial assintótico ". Essas interpretações de dificuldade são importantes no estudo de funções hash criptográficas comprovadamente seguras, mas geralmente não têm uma forte conexão com a segurança prática. Por exemplo, um algoritmo de tempo exponencial às vezes ainda pode ser rápido o suficiente para fazer um ataque viável. Por outro lado, um algoritmo de tempo polinomial (por exemplo, um que requer n 20 passos para chaves de n dígitos) pode ser muito lento para qualquer uso prático.

Ilustração

Uma ilustração do uso potencial de um hash criptográfico é a seguinte: Alice apresenta um problema matemático difícil para Bob e afirma que o resolveu. Bob gostaria de tentar sozinho, mas gostaria de ter certeza de que Alice não está blefando. Portanto, Alice anota sua solução, calcula seu hash e diz a Bob o valor do hash (enquanto mantém a solução em segredo). Então, quando Bob chega com a solução alguns dias depois, Alice pode provar que ela tinha a solução mais cedo, revelando-a e fazendo com que Bob faça um hash e verifique se ela corresponde ao valor de hash dado a ele antes. (Este é um exemplo de um esquema de compromisso simples ; na prática real, Alice e Bob frequentemente serão programas de computador, e o segredo seria algo menos facilmente falsificado do que uma alegada solução de quebra-cabeça.)

Formulários

Verificando a integridade de mensagens e arquivos

Uma aplicação importante de hashes seguros é a verificação da integridade da mensagem . Comparar resumos de mensagens (resumos de hash sobre a mensagem) calculados antes e depois da transmissão pode determinar se alguma alteração foi feita na mensagem ou no arquivo .

Os resumos de hash MD5 , SHA-1 ou SHA-2 às vezes são publicados em sites ou fóruns para permitir a verificação da integridade de arquivos baixados, incluindo arquivos recuperados usando compartilhamento de arquivos , como espelhamento . Essa prática estabelece uma cadeia de confiança , desde que os hashes sejam postados em um site confiável - geralmente o site de origem - autenticado por HTTPS . Usar um hash criptográfico e uma cadeia de confiança detecta alterações maliciosas no arquivo. Outros códigos de detecção de erros , como verificações de redundância cíclica, apenas evitam alterações não maliciosas do arquivo feitas por terceiros.

Geração e verificação de assinatura

Quase todos os esquemas de assinatura digital requerem que um hash criptográfico seja calculado sobre a mensagem. Isso permite que o cálculo da assinatura seja executado no hash digest relativamente pequeno e estaticamente dimensionado. A mensagem é considerada autêntica se a verificação da assinatura for bem-sucedida com base na assinatura e no resumo hash recalculado sobre a mensagem. Portanto, a propriedade de integridade da mensagem do hash criptográfico é usada para criar esquemas de assinatura digital seguros e eficientes.

Verificação de senha

A verificação de senha geralmente depende de hashes criptográficos. Armazenar todas as senhas de usuário como texto não criptografado pode resultar em uma violação massiva de segurança se o arquivo de senha for comprometido. Uma maneira de reduzir esse perigo é armazenar apenas o resumo hash de cada senha. Para autenticar um usuário, a senha apresentada pelo usuário é hash e comparada com o hash armazenado. Um método de redefinição de senha é necessário quando o hashing de senha é executado; as senhas originais não podem ser recalculadas a partir do valor de hash armazenado.

As funções criptográficas de hash padrão são projetadas para serem calculadas rapidamente e, como resultado, é possível tentar adivinhar senhas em altas taxas. Unidades de processamento gráfico comuns podem tentar bilhões de senhas possíveis a cada segundo. As funções de hash de senha que executam expansão de chave - como PBKDF2 , scrypt ou Argon2 - normalmente usam invocações repetidas de um hash criptográfico para aumentar o tempo (e em alguns casos, a memória do computador) necessário para realizar ataques de força bruta em compilações de hash de senha armazenadas. Um hash de senha requer o uso de um grande valor salt aleatório e não secreto que pode ser armazenado com o hash de senha. O salt torna aleatória a saída do hash da senha, tornando impossível para um adversário armazenar tabelas de senhas e valores de hash pré - computados com os quais o resumo do hash da senha pode ser comparado.

A saída de uma função hash de senha também pode ser usada como uma chave criptográfica. Os hashes de senha são, portanto, também conhecidos como funções de derivação de chave baseadas em senha (PBKDFs).

Prova de trabalho

Um sistema de prova de trabalho (ou protocolo ou função) é uma medida econômica para impedir ataques de negação de serviço e outros abusos de serviço, como spam em uma rede, exigindo algum trabalho do solicitante de serviço, geralmente significando tempo de processamento por um computador. Uma característica fundamental desses esquemas é sua assimetria: o trabalho deve ser moderadamente difícil (mas viável) do lado do solicitante, mas fácil de verificar para o provedor de serviços. Um sistema popular - usado na mineração de Bitcoin e Hashcash - usa inversões de hash parciais para provar que o trabalho foi feito, para desbloquear uma recompensa de mineração em Bitcoin e como um token de boa vontade para enviar um e-mail em Hashcash. O remetente deve encontrar uma mensagem cujo valor hash comece com um número de bits zero. O trabalho médio que o remetente precisa realizar para encontrar uma mensagem válida é exponencial no número de bits zero exigidos no valor de hash, enquanto o destinatário pode verificar a validade da mensagem executando uma única função de hash. Por exemplo, em Hashcash, um remetente é solicitado a gerar um cabeçalho cujo valor de hash SHA-1 de 160 bits tenha os primeiros 20 bits como zeros. O remetente terá, em média, que tentar 2 19 vezes para encontrar um cabeçalho válido.

Arquivo ou identificador de dados

Um resumo da mensagem também pode servir como meio de identificar um arquivo com segurança; vários sistemas de gerenciamento de código-fonte , incluindo Git , Mercurial e Monotone , usam o sha1sum de vários tipos de conteúdo (conteúdo de arquivo, árvores de diretório, informações de ancestralidade, etc.) para identificá-los exclusivamente. Hashes são usados ​​para identificar arquivos em redes de compartilhamento de arquivos ponto a ponto . Por exemplo, em um link ed2k , um hash MD4 -variant é combinado com o tamanho do arquivo, fornecendo informações suficientes para localizar as origens do arquivo, fazer download do arquivo e verificar seu conteúdo. Os links magnéticos são outro exemplo. Esses hashes de arquivo geralmente são o hash superior de uma lista de hash ou de uma árvore de hash, o que permite benefícios adicionais.

Uma das principais aplicações de uma função hash é permitir a consulta rápida de dados em uma tabela hash . Por serem funções hash de um tipo específico, as funções hash criptográficas também se adaptam bem a esse aplicativo.

No entanto, em comparação com as funções hash padrão, as funções hash criptográficas tendem a ser muito mais caras do ponto de vista computacional. Por esse motivo, eles tendem a ser usados ​​em contextos onde é necessário que os usuários se protejam contra a possibilidade de falsificação (a criação de dados com o mesmo resumo dos dados esperados) por participantes potencialmente mal-intencionados.

Funções de hash baseadas em cifras de bloco

Existem vários métodos para usar uma cifra de bloco para construir uma função hash criptográfica, especificamente uma função de compressão unilateral .

Os métodos se assemelham aos modos de operação da cifra de bloco normalmente usados ​​para criptografia. Muitas funções hash conhecidas, incluindo MD4 , MD5 , SHA-1 e SHA-2 , são construídas a partir de componentes semelhantes a cifras de bloco projetados para esse fim, com feedback para garantir que a função resultante não seja invertível. Os finalistas do SHA-3 incluíram funções com componentes semelhantes a cifras de bloco (por exemplo, Skein , BLAKE ), embora a função finalmente selecionada, Keccak , tenha sido construída em uma esponja criptográfica .

Uma cifra de bloco padrão, como AES, pode ser usada no lugar dessas cifras de bloco personalizadas; isso pode ser útil quando um sistema embarcado precisa implementar criptografia e hash com tamanho mínimo de código ou área de hardware. No entanto, essa abordagem pode ter custos de eficiência e segurança. As cifras nas funções de hash são construídas para hash: elas usam chaves e blocos grandes, podem alterar as chaves com eficiência a cada bloco e foram projetadas e examinadas quanto à resistência a ataques de chaves relacionadas . Cifras de uso geral tendem a ter objetivos de design diferentes. Em particular, o AES tem tamanhos de chave e bloco que o tornam não trivial para usar para gerar valores de hash longos; A criptografia AES se torna menos eficiente quando a chave muda cada bloco; e ataques de chave relacionada o tornam potencialmente menos seguro para uso em uma função hash do que para criptografia.

Design de função hash

Construção Merkle-Damgård

A construção de hash Merkle-Damgård

Uma função hash deve ser capaz de processar uma mensagem de comprimento arbitrário em uma saída de comprimento fixo. Isso pode ser conseguido dividindo a entrada em uma série de blocos de tamanhos iguais e operando neles em sequência usando uma função de compressão unilateral . A função de compressão pode ser especialmente projetada para hash ou ser construída a partir de uma cifra de bloco. Uma função hash construída com a construção Merkle – Damgård é tão resistente a colisões quanto sua função de compressão; qualquer colisão para a função hash completa pode ser rastreada até uma colisão na função de compressão.

O último bloco processado também deve ser preenchido de forma inequívoca ; isso é crucial para a segurança dessa construção. Esta construção é chamada de construção Merkle-Damgård . As funções hash clássicas mais comuns, incluindo SHA-1 e MD5 , assumem esta forma.

Tubo largo versus tubo estreito

Uma aplicação direta da construção Merkle – Damgård, onde o tamanho da saída de hash é igual ao tamanho do estado interno (entre cada etapa de compressão), resulta em um design hash de tubo estreito . Esse design causa muitas falhas inerentes, incluindo extensão de comprimento , multicolisões, ataques de mensagens longas, ataques de geração e colagem e também não pode ser paralelizado. Como resultado, as funções hash modernas são construídas em construções de tubos largos que têm um tamanho de estado interno maior - que varia de ajustes na construção Merkle-Damgård a novas construções, como a construção de esponja e a construção HAIFA . Nenhum dos participantes da competição de função hash do NIST usa uma construção Merkle-Damgård clássica.

Enquanto isso, truncar a saída de um hash mais longo, como o usado no SHA-512/256, também derrota muitos desses ataques.

Use na construção de outras primitivas criptográficas

As funções de hash podem ser usadas para construir outras primitivas criptográficas. Para que essas outras primitivas sejam criptograficamente seguras, deve-se tomar cuidado para criá-las corretamente.

Os códigos de autenticação de mensagens (MACs) (também chamados de funções hash com chave) são geralmente criados a partir de funções hash. HMAC é um MAC.

Assim como as cifras de bloco podem ser usadas para construir funções hash, as funções hash podem ser usadas para construir cifras de bloco. As construções de Luby-Rackoff usando funções hash podem ser comprovadamente seguras se a função hash subjacente for segura. Além disso, muitas funções hash (incluindo SHA-1 e SHA-2 ) são criadas usando uma cifra de bloco de propósito especial em um Davies – Meyer ou outra construção. Essa cifra também pode ser usada em modo convencional de operação, sem as mesmas garantias de segurança. Veja SHACAL , BEAR e LION .

Geradores de números pseudo-aleatórios (PRNGs) podem ser construídos usando funções hash. Isso é feito combinando uma semente aleatória (secreta) com um contador e fazendo o hash.

Algumas funções hash, como Skein , Keccak e RadioGatún , geram um stream arbitrariamente longo e podem ser usadas como uma cifra de stream , e cifras de stream também podem ser criadas a partir de funções de hash digest de comprimento fixo. Freqüentemente, isso é feito primeiro construindo um gerador de números pseudo-aleatórios criptograficamente seguro e, em seguida, usando seu fluxo de bytes aleatórios como fluxo de chaves . SEAL é uma cifra de stream que usa SHA-1 para gerar tabelas internas, que são então usadas em um gerador de keystream mais ou menos não relacionado ao algoritmo de hash. O SEAL não tem garantia de ser tão forte (ou fraco) quanto SHA-1. Da mesma forma, a expansão de chave das cifras de fluxo HC-128 e HC-256 faz uso intenso da função de hash SHA-256 .

Concatenação

A concatenação de saídas de várias funções hash fornece resistência à colisão tão boa quanto o mais forte dos algoritmos incluídos no resultado concatenado. Por exemplo, versões mais antigas do Transport Layer Security (TLS) e Secure Sockets Layer (SSL) usavam somas MD5 e SHA-1 concatenadas . Isso garante que um método para localizar colisões em uma das funções hash não invalide os dados protegidos por ambas as funções hash.

Para funções hash de construção Merkle-Damgård , a função concatenada é tão resistente a colisões quanto seu componente mais forte, mas não mais resistente a colisões. Antoine Joux observou que 2-colisões levam a n- colisões: se for viável para um invasor encontrar duas mensagens com o mesmo hash MD5, ele poderá encontrar quantas mensagens adicionais desejar com o mesmo hash MD5, sem maior dificuldade. Entre essas n mensagens com o mesmo hash MD5, é provável que haja uma colisão no SHA-1. O trabalho adicional necessário para encontrar a colisão SHA-1 (além da pesquisa de aniversário exponencial) requer apenas tempo polinomial .

Algoritmos de hash criptográficos

Existem muitos algoritmos de hash criptográficos; esta seção lista alguns algoritmos que são referenciados com relativa freqüência. Uma lista mais extensa pode ser encontrada na página que contém uma comparação de funções hash criptográficas .

MD5

MD5 foi projetado por Ronald Rivest em 1991 para substituir uma função hash anterior, MD4, e foi especificado em 1992 como RFC 1321. Colisões contra MD5 podem ser calculadas em segundos, o que torna o algoritmo inadequado para a maioria dos casos de uso em que um hash criptográfico é necessário. MD5 produz um resumo de 128 bits (16 bytes).

SHA-1

O SHA-1 foi desenvolvido como parte do projeto Capstone do governo dos EUA . A especificação original - agora comumente chamada de SHA-0 - do algoritmo foi publicada em 1993 sob o título Secure Hash Standard, FIPS PUB 180, pela agência de padrões do governo dos EUA NIST (National Institute of Standards and Technology). Ele foi retirado pela NSA logo após a publicação e foi substituído pela versão revisada, publicada em 1995 no FIPS PUB 180-1 e comumente designada SHA-1. Colisões contra o algoritmo SHA-1 completo podem ser produzidas usando o ataque quebrado e a função hash deve ser considerada quebrada. SHA-1 produz um resumo hash de 160 bits (20 bytes).

Os documentos podem referir-se ao SHA-1 apenas como "SHA", mesmo que isso possa entrar em conflito com outros Algoritmos Hash Seguros, como SHA-0, SHA-2 e SHA-3.

RIPEMD-160

RIPEMD (RACE Integrity Primitives Evaluation Message Digest) é uma família de funções criptográficas de hash desenvolvida em Leuven, Bélgica, por Hans Dobbertin, Antoon Bosselaers e Bart Preneel no grupo de pesquisa COSIC na Katholieke Universiteit Leuven, e publicado pela primeira vez em 1996. RIPEMD foi baseado nos princípios de design usados ​​no MD4 e é semelhante em desempenho ao SHA-1 mais popular. RIPEMD-160, entretanto, não foi quebrado. Como o nome indica, RIPEMD-160 produz um resumo hash de 160 bits (20 bytes).

Hidromassagem

Whirlpool é uma função hash criptográfica desenvolvida por Vincent Rijmen e Paulo SLM Barreto, que a descreveu pela primeira vez em 2000. Whirlpool é baseada em uma versão substancialmente modificada do Advanced Encryption Standard (AES). O Whirlpool produz um resumo de hash de 512 bits (64 bytes).

SHA-2

SHA-2 (Secure Hash Algorithm 2) é um conjunto de funções criptográficas de hash projetado pela Agência de Segurança Nacional dos Estados Unidos (NSA), publicado pela primeira vez em 2001. Eles são construídos usando a estrutura Merkle-Damgård, a partir de uma função de compressão unilateral ele próprio construído usando a estrutura Davies – Meyer de uma cifra de bloco especializada (classificada).

O SHA-2 consiste basicamente em dois algoritmos de hash: SHA-256 e SHA-512. SHA-224 é uma variante do SHA-256 com diferentes valores iniciais e saída truncada. SHA-384 e os menos conhecidos SHA-512/224 e SHA-512/256 são variantes de SHA-512. O SHA-512 é mais seguro do que o SHA-256 e geralmente mais rápido do que o SHA-256 em máquinas de 64 bits, como AMD64 .

O tamanho de saída em bits é dado pela extensão ao nome "SHA", portanto SHA-224 tem um tamanho de saída de 224 bits (28 bytes); SHA-256, 32 bytes; SHA-384, 48 bytes; e SHA-512, 64 bytes.

SHA-3

SHA-3 (Secure Hash Algorithm 3) foi lançado pelo NIST em 5 de agosto de 2015. SHA-3 é um subconjunto da família primitiva criptográfica mais ampla Keccak. O algoritmo Keccak é obra de Guido Bertoni, Joan Daemen, Michael Peeters e Gilles Van Assche. Keccak é baseado em uma construção de esponja que também pode ser usada para construir outras primitivas criptográficas, como uma cifra de fluxo. SHA-3 fornece os mesmos tamanhos de saída que SHA-2: 224, 256, 384 e 512 bits.

Tamanhos de saída configuráveis ​​também podem ser obtidos usando as funções SHAKE-128 e SHAKE-256. Aqui, as extensões -128 e -256 do nome implicam na força de segurança da função, em vez do tamanho de saída em bits.

BLAKE2

BLAKE2, uma versão melhorada do BLAKE, foi anunciado em 21 de dezembro de 2012. Foi criado por Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn e Christian Winnerlein com o objetivo de substituir o MD5 amplamente usado, mas quebrado e Algoritmos SHA-1. Quando executado em arquiteturas x64 e ARM de 64 bits, BLAKE2b é mais rápido do que SHA-3, SHA-2, SHA-1 e MD5. Embora BLAKE e BLAKE2 não tenham sido padronizados como o SHA-3, BLAKE2 tem sido usado em muitos protocolos, incluindo o hash de senha Argon2 , pela alta eficiência que oferece em CPUs modernas. Como BLAKE era um candidato para SHA-3, BLAKE e BLAKE2 oferecem os mesmos tamanhos de saída do SHA-3 - incluindo um tamanho de saída configurável.

BLAKE3

BLAKE3, uma versão melhorada do BLAKE2, foi anunciado em 9 de janeiro de 2020. Foi criado por Jack O'Connor, Jean-Philippe Aumasson, Samuel Neves e Zooko Wilcox-O'Hearn. BLAKE3 é um algoritmo único, em contraste com BLAKE e BLAKE2, que são famílias de algoritmos com múltiplas variantes. A função de compressão BLAKE3 é fortemente baseada na de BLAKE2s, com a maior diferença sendo que o número de rodadas é reduzido de 10 para 7. Internamente, BLAKE3 é uma árvore Merkle e suporta graus mais altos de paralelismo do que BLAKE2.

Ataques a algoritmos de hash criptográficos

Há uma longa lista de funções criptográficas de hash, mas muitas delas são vulneráveis ​​e não devem ser usadas. Por exemplo, o NIST selecionou 51 funções de hash como candidatas para a rodada 1 da competição de hash SHA-3, das quais 10 foram consideradas quebradas e 16 mostraram fraquezas significativas e, portanto, não passaram para a próxima rodada; mais informações podem ser encontradas no artigo principal sobre as competições de função hash do NIST .

Mesmo que uma função hash nunca tenha sido quebrada, um ataque bem - sucedido contra uma variante enfraquecida pode minar a confiança dos especialistas. Por exemplo, em agosto de 2004, foram encontradas colisões em várias funções hash populares, incluindo MD5. Essas fraquezas colocaram em questão a segurança de algoritmos mais fortes derivados das funções hash fracas - em particular, SHA-1 (uma versão reforçada de SHA-0), RIPEMD-128 e RIPEMD-160 (ambas as versões reforçadas de RIPEMD).

Em 12 de agosto de 2004, Joux, Carribault, Lemuel e Jalby anunciaram uma colisão para o algoritmo SHA-0 completo. Joux et al. conseguiu isso usando uma generalização do ataque de Chabaud e Joux. Eles descobriram que a colisão tinha complexidade 2 51 e levou cerca de 80.000 horas de CPU em um supercomputador com 256 processadores Itanium 2 - equivalente a 13 dias de uso em tempo integral do supercomputador.

Em fevereiro de 2005, foi relatado um ataque ao SHA-1 que encontraria colisão em cerca de 2 69 operações de hash, em vez dos 2 80 esperados para uma função de hash de 160 bits. Em agosto de 2005, outro ataque ao SHA-1 foi relatado que encontraria colisões em 2 63 operações. Outras fraquezas teóricas do SHA-1 são conhecidas: e em fevereiro de 2017, o Google anunciou uma colisão no SHA-1. Os pesquisadores de segurança recomendam que novos aplicativos podem evitar esses problemas usando membros posteriores da família SHA, como SHA-2 , ou usando técnicas como hash aleatório que não requer resistência à colisão.

Um ataque prático e bem-sucedido quebrou o MD5 usado nos certificados do Transport Layer Security em 2008.

Muitos hashes criptográficos são baseados na construção Merkle – Damgård . Todos os hashes criptográficos que usam diretamente a saída completa de uma construção Merkle – Damgård são vulneráveis ​​a ataques de extensão de comprimento . Isso torna os algoritmos de hash MD5, SHA-1, RIPEMD-160, Whirlpool e SHA-256 / SHA-512 vulneráveis ​​a esse ataque específico. SHA-3, BLAKE2, BLAKE3 e as variantes truncadas de SHA-2 não são vulneráveis ​​a esse tipo de ataque.

Ataques a senhas com hash

Um uso comum de hashes é armazenar dados de autenticação de senha. Em vez de armazenar o texto simples das senhas dos usuários, um sistema de acesso controlado armazena o hash da senha de cada usuário em um arquivo ou banco de dados. Quando alguém solicita acesso, a senha enviada é hash e comparada com o valor armazenado. Se o banco de dados for roubado (uma ocorrência muito frequente), o ladrão terá apenas os valores de hash, não as senhas.

No entanto, a maioria das pessoas escolhe senhas de maneiras previsíveis. Listas de senhas comuns são amplamente divulgadas e muitas senhas são curtas o suficiente para que todas as combinações possíveis possam ser testadas se hashes rápidos forem usados. O uso de sal criptográfico evita alguns ataques, como a construção de arquivos de valores de hash pré-computados, por exemplo, rainbow tables . Mas pesquisas na ordem de 100 bilhões de testes por segundo são possíveis com processadores gráficos de última geração , tornando os ataques diretos possíveis até mesmo com sal. O Instituto Nacional de Padrões e Tecnologia dos Estados Unidos recomenda o armazenamento de senhas usando hashes especiais chamados de funções de derivação de chave (KDFs), que foram criados para reduzir a velocidade de pesquisas de força bruta. Hashes lentos incluem pbkdf2 , bcrypt , scrypt , argon2 , Balloon e alguns modos recentes de Unix crypt . Para KSFs que executam vários hashes para diminuir a execução, o NIST recomenda uma contagem de iteração de 10.000 ou mais.

Veja também

Referências

Citações

Fontes

links externos