# SHA-2

SHA-2 é um conjunto de funções hash criptográficas projetadas pela NSA (Agência de Segurança Nacional dos EUA). SHA significa secure hash algorithm (algoritmo de hash seguro). Funções hash criptográficas são operações matemáticas executadas em dados digitais; comparando o hash computado (a saída de execução do algoritmo) a um valor de hash conhecido e esperado, uma pessoa pode determinar a integridade dos dados. Por exemplo, calcular o hash de um arquivo baixado e comparar o resultado com um resultado hash publicado anteriormente pode mostrar se o download foi modificado ou adulterado. Um aspecto importante das funções hash criptográficas é a sua resistência à colisão: ninguém deve ser capaz de encontrar dois valores de entrada diferentes que resultam na mesma saída de hash.
SHA-2 inclui mudanças significativas de seu antecessor, SHA-1. A família SHA-2 é composta por seis funções hash com resumos (valores de hash) que são de 224, 256, 384 ou 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.
SHA-256 e SHA-512 são funções hash inovadoras computadas com palavras de 32 e 64 bytes, respectivamente. Eles usam quantidades de deslocamento e constantes aditivas diferentes, mas as suas estruturas são praticamente idênticas, diferindo apenas no número de rodadas. SHA-224 e SHA-384 são simplesmente versões truncadas das duas primeiras, calculadas com valores iniciais diferentes. SHA-512/224 e SHA-512/256 também são versões truncadas de SHA-512, mas os valores iniciais são gerados usando o método descrito no FIPS PUB 180-4. SHA-2 foi publicada em 2001 pelo NIST como um padrão federal dos Estados Unidos (FIPS). A família SHA-2 de algoritmos está patenteada em US 6829355. Os Estados Unidos lançou a patente sob uma licença livre de royalties.
Em 2005, surgiu um algoritmo para encontrar colisões SHA-1 em cerca de 2000 vezes menos etapas do que se pensava possível. Em 23 de fevereiro de 2017, o grupo CWI Amsterdam e a Google anunciaram um ataque prático de colisão contra o SHA-1.. A margem de segurança deixada por SHA-1 é mais fraca do que a pretendida, e seu uso é, portanto, não recomendado para aplicações que dependem de resistência à colisão, tais como assinaturas digitais. Embora SHA-2 tenha algumas semelhanças com o algoritmo SHA-1, esses ataques não foram estendidos com sucesso para SHA-2.
Atualmente, os melhores ataques públicos quebram a resistência à preimagem em 52 rodadas de SHA-256 ou 57 rodadas de SHA-512, e resistência de colisão para 46 rodadas de SHA-256, como mostrado na seção Criptoanálise e validação abaixo.

## Padrão hash

Com a publicação do FIPS PUB 180-2, NIST acrescentou três funções hash adicionais na família SHA. Os algoritmos são conhecidos coletivamente como SHA-2, em homenagem a seus comprimentos de resumo (em bits): SHA-256, SHA-384 e SHA-512.
Os algoritmos foram publicadas pela primeira vez em 2001 no projeto da FIPS PUB 180-2, no tempo em que opinião e observações públicas eram aceitas. Em agosto de 2002, FIPS PUB 180-2 se tornou o novo Padrão de Hash Seguro, substituindo FIPS PUB 180-1, que foi lançado em abril de 1995. A norma atualizada incluía o algoritmo SHA-1 original, com a notação técnica atualizada consistente com a descrição do funcionamento interno da família SHA-2.
Em fevereiro de 2004, uma notificação de mudança foi publicada por FIPS PUB 180-2, especificando uma variante adicional, SHA-224, definida para coincidir com o comprimento da chave da 3DES de chave dupla. Em outubro de 2008, o padrão foi atualizado no FIPS PUB 180-3, incluindo SHA-224 a partir da notificação de mudança, mas sem fazer mudanças fundamentais no padrão. A principal motivação para a atualização do padrão foi a transferência de informações de segurança sobre os algoritmos de hash e recomendações para a sua utilização para Publicações Especiais 800-107 e 800-57. Os dados de testes detalhados e exemplos de resumos de mensagem também foram removidos do padrão, e fornecidos como documentos separados.
Em janeiro de 2011, NIST publicou SP800-131A, que especificou um movimento a partir do mínimo de segurança atual de 80-bits (fornecido pelo SHA-1) permitido para uso do governo federal até o final de 2013, com a segurança de 112 bits (fornecido pelo SHA-2), sendo requisito mínimo de fato a partir daí, e o nível de segurança recomendado a partir da data de publicação.
Em março de 2012, o padrão foi atualizado no FIPS PUB 180-4, incluindo as funções de hash SHA-512/224 e SHA-512/256, e descrevendo um método para gerar valores iniciais para as versões truncadas de SHA-512. Além disso, uma restrição ao preenchimento dos dados de entrada antes do cálculo do hash foi removida, permitindo aos dados de hash a serem calculados simultaneamente com a geração de conteúdo, como um vídeo ou áudio em tempo real. Preencher o bloco de dados final ainda deverá ocorrer antes da saída do hash.
Em julho de 2012, NIST revisou o SP800-57, que fornece orientações para a gestão de chaves criptográficas. A publicação não permite criação de assinaturas digitais com um hash de segurança inferior a 112 bits a partir de 2013. A revisão anterior de 2007 especificava o ponto de corte para ser o final de 2010. Em agosto de 2012, NIST revisou SP800-107 da mesma maneira.
A competição de funções hash do NIST selecionou uma nova função hash, SHA-3, em 2012. O algoritmo SHA-3 não é derivado de SHA-2.

## Aplicações

A função hash SHA-2 é implementada em algumas aplicações de segurança e protocolos amplamente usados, incluindo TLS e SSL, PGP, SSH, S/MIME, e IPsec.
SHA-256 é usado como parte do processo de autenticação de pacotes de software Debian GNU/Linux e no padrão DKIM de assinatura de mensagens; SHA-512 é parte de um sistema para autenticar vídeos de arquivos do Tribunal Penal Internacional para o genocídio de Ruanda. SHA-256 e SHA-512 foram propostos para utilização no DNSSEC. Fornecedores de Unix e Linux estão se movimentando para usar 256 e 512-bit SHA-2 para o cálculo de dispersão seguro de senhas.
Várias criptomoedas como Bitcoin usam SHA-256 para verificar transações e calculam a prova-de-trabalho ou prova-de-participação (do inglês, proof of stake). A ascensão de chips aceleradores ASIC SHA-2 tem levado ao uso de esquemas de prova-de-trabalho baseados em scrypt.
SHA-1 e SHA-2 são os algoritmos de hash seguros exigidos por lei para o uso em certas aplicações do Governo dos EUA, incluindo o uso dentro de outros algoritmos e protocolos criptográficos, para a proteção da informação não-confidencial sensível. FIPS PUB 180-1 também incentivou adoção e utilização de SHA-1 por organizações privadas e comerciais. SHA-1 está sendo reformada para a maioria dos usos do governo; o Instituto Nacional de Padrões e Tecnologia diz: "As agências federais devem parar de usar SHA-1 para ... aplicações que exigem resistência à colisão, logo que possível, e devem usar a família SHA-2 de funções hash para estas aplicações depois de 2010" (ênfase original). A diretiva do NIST de que as agências do governo dos EUA devem parar com os usos de SHA-1 depois de 2010 e a conclusão do SHA-3 podem acelerar o fim do uso de SHA-1.
As funções SHA-2 não são tão amplamente utilizadas como SHA-1, apesar de sua maior segurança. Razões podem incluir falta de suporte para SHA-2 em sistemas que rodam o Windows XP SP2 ou versões posteriores, ou a falta de urgência percebida desde que colisões em SHA-1 ainda não foram encontradas.

## Criptoanálise e validação

Para uma função hash em que L é o número de bits no resumo de mensagem, encontrar uma mensagem que corresponde a um dado resumo de mensagem sempre pode ser feito usando uma busca de força bruta em 2$^L$ avaliações. Isto é chamado um ataque de preimagem e pode ou não ser prático, dependendo de L e do ambiente de computação em particular. O segundo critério, encontrar duas mensagens diferentes que produzem o mesmo resumo de mensagem, conhecido como uma colisão, requer, em média, apenas 2$^{L/2}$ avaliações usando um ataque do aniversário.
Algumas das aplicações que usam hashes criptográficos, como o armazenamento de senha, só são minimamente afetados por um ataque de colisão. Construindo uma senha que trabalha para uma determinada conta requer um ataque de preimagem, bem como o acesso ao hash da senha original (normalmente num arquivo obscuro), o que pode ou não ser trivial. Inverter a encriptação da senha (por exemplo, para obter uma senha para tentar usá-la contra a conta de um usuário em outro lugar) não é possível com esses ataques (no entanto, mesmo um hash de senha seguro não pode impedir ataques de força bruta em senhas fracas).
No caso de assinatura de documentos, um invasor não pode simplesmente falsificar uma assinatura de um documento - o atacante existente teria que produzir um par de documentos, um inócuo e um prejudicial, e obter o detentor da chave privada para assinar o documento inócuo. Há circunstâncias concretas em que isso é possível; até o final de 2008, foi possível criar certificados SSL falsificados usando uma colisão em MD5.
O aumento do interesse na análise hash criptográfico durante a competição SHA-3 produziu vários novos ataques contra a família SHA-2, os melhores são dados na tabela abaixo. Apenas os ataques de colisão são de complexidade prática; nenhum dos ataques se estendem para a função hash com rodada completa.
No FSE 2012, pesquisadores da Sony fizeram uma apresentação sugerindo que ataques de pseudo-colisão poderiam ser estendidos para 52 rodadas no SHA-256 e 57 rodadas no SHA-512 através da construção sobre o ataque de pseudo-preimagem biclique.
| Publicado em | Ano | Método de ataque | Ataque | Variante | Rodadas | Complexidade |
| New Collision Attacks Against Up To 24-step SHA-2 | 2008 | Deterministico | Colisão | SHA-256 | 24/64 | 2$^{28.5}$ |
| New Collision Attacks Against Up To 24-step SHA-2 | 2008 | Deterministico | Colisão | SHA-512 | 24/80 | 2$^{32.5}$ |
| Preimages for step-reduced SHA-2 | 2009 | Encontro-no-meio | Preimagem | SHA-256 | 42/64 | 2$^{251.7}$ |
| Preimages for step-reduced SHA-2 | 2009 | Encontro-no-meio | Preimagem | SHA-256 | 43/64 | 2$^{254.9}$ |
| Preimages for step-reduced SHA-2 | 2009 | Encontro-no-meio | Preimagem | SHA-512 | 42/80 | 2$^{502.3}$ |
| Preimages for step-reduced SHA-2 | 2009 | Encontro-no-meio | Preimagem | SHA-512 | 46/80 | 2$^{511.5}$ |
| Advanced meet-in-the-middle preimage attacks | 2010 | Encontro-no-meio | Preimagem | SHA-256 | 42/64 | 2$^{248.4}$ |
| Advanced meet-in-the-middle preimage attacks | 2010 | Encontro-no-meio | Preimagem | SHA-512 | 42/80 | 2$^{494.6}$ |
| Higher-Order Differential Attack on Reduced SHA-256 | 2011 | Diferencial | Pseudo-colisão | SHA-256 | 46/64 | 2$^{178}$ |
| Higher-Order Differential Attack on Reduced SHA-256 | 2011 | Diferencial | Pseudo-colisão | SHA-256 | 46/64 | 2$^{46}$ |
| Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family | 2011 | Biclique | Preimagem | SHA-256 | 45/64 | 2$^{255.5}$ |
| Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family | 2011 | Biclique | Preimagem | SHA-512 | 50/80 | 2$^{511.5}$ |
| Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family | 2011 | Biclique | Pseudo-preimagem | SHA-256 | 52/64 | 2$^{255}$ |
| Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family | 2011 | Biclique | Pseudo-preimagem | SHA-512 | 57/80 | 2$^{511}$ |
| Improving Local Collisions: New Attacks on Reduced SHA-256 | 2013 | Diferencial | Colisão | SHA-256 | 31/64 | 2$^{65.5}$ |
| Improving Local Collisions: New Attacks on Reduced SHA-256 | 2013 | Diferencial | Pseudo-colisão | SHA-256 | 38/64 | 2$^{37}$ |
| Branching Heuristics in Differential Collision Search with Applications to SHA-512 | 2014 | Diferencial heurístico | Pseudo-colisão | SHA-512 | 38/80 | 2$^{40.5}$ |

## Validação oficial

Implementações de todas as funções de segurança aprovadas pelo FIPS podem ser oficialmente validadas através do programa de CMVP, executado conjuntamente pelo Instituto Nacional de Padrões e Tecnologia (NIST) e o Communications Security Establishment (CSE). Para verificação informal, um pacote para gerar um elevado número de vetores de teste é disponibilizado para download no site do NIST; a verificação resultante no entanto não substitui a validação formal CMVP, o que é exigido por lei para determinadas aplicações.
Em dezembro de 2013, já existiam mais de 1300 implementações validadas da SHA-256 e mais de 900 da SHA-512, com apenas 5 delas sendo capazes de lidar com as mensagens com um comprimento em bits não-múltiplo de oito, suportando ambas as variantes (ver Lista de validação SHS).

## Exemplos de variantes SHA-2

Valores hash para palavra vazia:
Até mesmo uma pequena mudança na mensagem irá (com probabilidade massiva) resultar em um hash bastante diferente, devido ao efeito avalanche. Por exemplo, adicionando um ponto final ao final da frase:

## Pseudocódigo

Segue o pseudocódigo para o algoritmo SHA-256. Note o grande acréscimo na mistura entre bits das w[16..63] palavras em comparação com SHA-1.
A computação dos valores ch e maj pode ser otimizada da mesma maneira como é descrita para SHA-1.
SHA-224 é idêntica à SHA-256, exceto que:
* os valores hash iniciais de h0 até h7 são diferentes, e
* a saída e construída omitindo-se h7.
SHA-512 é idêntica em relação à estrutura a SHA-256, mas,
* A mensagem é quebrada em pedaços de 512 bits.
* Os valores hash iniciais e constantes de rodada são estendidos até 64 bits.
* Há 80 rodadas em vez de 64,
* O array de escalonamento da mensagem w tem 80 palavras de 64 bits em vez de 64 palavras de 32 bits,
* Para estender o array w, o laço é de 16 até 79 em vez de 16 até 63,
* As constantes de rodada são baseadas nos primeiros 80 primos 2..409,
* O tamanho de palavra usado para os cálculos é de 64 bits,
* O tamanho anexado da mensagem (antes do pré-processamento), em bits, é um inteiro de 128 bits em big-endian, e
* As quantidades de deslocamentos e rotações são diferentes.
SHA-384 é idêntica a SHA-512, exceto que:
* os valores iniciais de h0 até h7 são diferentes (tirados do 9º até o 16º primo), e
* a saída é construída omitindo-se h6 e h7.
SHA-512/t é idêntica à SHA-512 exceto que:
* os valores iniciais de h0 até h7 são dados pela função de geração SHA-512/t IV,
* a saída é construída truncando-se a concatenação deh0 até h7 em t bits,
* t igual a 384 não é permitido, em vez disso, SHA-384 deve ser utilizado como especificado, e
* valores t de 224 e 256 são especialmente mencionados como apovados.
A função de geração SHA-512/t IV avalia um SHA-512 modificado na palavra em ASCII "SHA-512/t", substituído com a representação decimal de t. A SHA-512 modificada é a mesma que SHA-512, exceto que seus valores iniciais de h0 até h7 foram XORados com a constante hexadecimal 0xa5a5a5a5a5a5a5a5.

# Comparação de funções SHA

Na tabela abaixo, estado interno significa a "soma do hash interno" após cada compressão de bloco de dados.
Comparação de funções SHA :
| Algoritmo e variantes | Algoritmo e variantes | Tamanho da saída (bits) | Tamanho do estado interno (bits) | Tamanho do bloco (bits) | Tamanho máximo de mensagem (bits) | Rodadas | Operações | Segurança (bits) | Performance Exemplo (MiB/s) |
| MD5 (como referencia) | MD5 (como referencia) | 128 | 128 (4 × 32) | 512 | 2$^{64}$ − 1 | 64 | And, Xor, Rot, Add (mod 2$^{32}$), Or | <64 (colisões encontradas) | 335 |
| SHA-0 | SHA-0 | 160 | 160 (5 × 32) | 512 | 2$^{64}$ − 1 | 80 | And, Xor, Rot, Add (mod 2$^{32}$), Or | <80 (colisões encontradas) | - |
| SHA-1 | SHA-1 | 160 | 160 (5 × 32) | 512 | 2$^{64}$ − 1 | 80 | And, Xor, Rot, Add (mod 2$^{32}$), Or | <80 (ataque teórico em 2$^{61}$ operações) | 192 |
| SHA-2 | SHA-224 SHA-256 | 224 256 | 256 (8 × 32) | 512 | 2$^{64}$ − 1 | 64 | And, Xor, Rot, Add (mod 2$^{32}$), Or, Shr | 112 128 | 139 |
| SHA-2 | SHA-384 SHA-512 SHA-512/224 SHA-512/256 | 384 512 224 256 | 512 (8 × 64) | 1024 | 2$^{128}$ − 1 | 80 | And, Xor, Rot, Add (mod 2$^{64}$), Or, Shr | 192 256 112 128 | 154 |
| SHA-3 | SHA3-224 SHA3-256 SHA3-384 SHA3-512 | 224 256 384 512 | 1600 (5 × 5 × 64) | 1152 1088 832 576 | Ilimitado | 24 | And, Xor, Rot, Not | 112 128 192 256 | - |
| SHA-3 | SHAKE128 SHAKE256 | d (arbitrario) d (arbitrario) | 1600 (5 × 5 × 64) | 1344 1088 | Ilimitado | 24 | And, Xor, Rot, Not | min (d/2, 128) min (d/2, 256) | - |
Na coluna operações bit a bit, "rot" significa girar sem transporte, e "shr" significa deslocamento lógico para a direita. Todos estes algoritmos utilizam adição modular de alguma forma, exceto para SHA-3.
Os números de desempenho acima foram para uma aplicação de thread única em um AMD Opteron 8354 rodando a 2,2 GHz sob o Linux em modo de 64 bits, e servem apenas como um ponto grosseiro para comparação geral. Medidas de desempenho mais detalhadas sobre arquiteturas de processadores modernos são dados na tabela abaixo.
| Arquitetura de CPU | Frequência | Algoritmo | Tamanho das palavras (bits) | Cyclos/byte x86 | MiB/s x86 | Cycles/byte x86-64 | MiB/s x86-64 |
| Intel Ivy Bridge | 3.5 GHz | SHA-256 | 32-bit | 16.80 | 199 | 13.05 | 256 |
| Intel Ivy Bridge | 3.5 GHz | SHA-512 | 64-bit | 43.66 | 76 | 8.48 | 394 |
| AMD Piledriver | 3.8 GHz | SHA-256 | 32-bit | 22.87 | 158 | 18.47 | 196 |
| AMD Piledriver | 3.8 GHz | SHA-512 | 64-bit | 88.36 | 41 | 12.43 | 292 |
Os números de desempenho com a etiqueta 'x86' estavam em execução usando o código de 32 bits em processadores de 64 bits, enquanto que os números dos x86-64 'são código nativo de 64 bits'. Enquanto SHA-256 foi projetada para cálculos de 32 bits, ela se beneficia de código otimizado para processadores de 64 bits. Implementações de SHA-512 de 32 bits são significativamente mais lentas do que as suas contrapartidas de 64 bits. Variantes de ambos os algoritmos com diferentes tamanhos de saída irão executar da mesma forma, uma vez que as funções de compressão e expansão de mensagem são idênticas, e apenas os valores iniciais de hash e de saída são de diferentes tamanhos. As melhores implementações de MD5 e SHA-1 realizam entre 4,5 e 6 ciclos por byte em processadores modernos.
O teste foi realizado pela Universidade de Illinois em Chicago, em seu sistema hydra8 executando um Intel Xeon E3-1275 V2 a uma velocidade de clock de 3,5 GHz, e em seu sistema hydra9 executando um A10-5800K AMD com uma velocidade de clock de 3,8 GHz. Os ciclos referenciados por byte velocidades acima são o desempenho médio de um algoritmo de resumo deu ma mensagem de 4.096 bytes usando o software de referenciamento criptográfico Supercop. O desempenho MiB/s é extrapolado a partir da velocidade do clock da CPU em um único núcleo, o desempenho no mundo real pode variar devido a uma variedade de fatores.