SHA-2 (Secure Hash Algorithm 2) é unha familia de funcións hash criptográficas deseñada pola National Security Agency dos Estados Unidos e publicada polo NIST. Inclúe SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 e SHA-512/256, con resumos de 224, 256, 384 ou 512 bits.
SHA-256 e SHA-512 empregan palabras de 32 e 64 bits, respectivamente, e difiren tamén no tamaño dos bloques, nas roldas, nas constantes e nalgunhas operacións. As outras variantes modifican os valores iniciais e a lonxitude da saída conforme ao estándar.
Estándar e evolución As primeiras variantes publicáronse no borrador de FIPS 180-2 en 2001 e incorporáronse ao estándar aprobado en 2002. SHA-224 engadiuse en 2004. A revisión de 2012, FIPS 180-4, incorporou SHA-512/224 e SHA-512/256 e un método para obter valores iniciais para variantes truncadas; a publicación actualizada de FIPS 180-4 data de agosto de 2015.Aviso 02-21599 do Federal Register, Announcing Approval of FIPS Publication 180-2
En 2023 o NIST anunciou que revisaría FIPS 180-4. A retirada de SHA-1 forma parte do plan de transición anunciado pola axencia; unha intención de revisión non debe confundirse coa publicación dun estándar novo.
Unha construción de hash foi obxecto da patente estadounidense US 6 829 355, concedida en 2004. A declaración de propiedade intelectual presentada aos organismos de normalización ofrecía licenzas sen regalías baixo as condicións indicadas; non equivale a afirmar que todas as variantes permanezan baixo unha patente vixente.Glenn M. Lilly, «Device for and method of one-way cryptographic hashing», patente estadounidense 6.829.355, asignada á National Security Agency, publicada o 7 de decembro de 2004.
Aplicacións
As funcións SHA-2 utilízanse en construcións de sinatura, autenticación e derivación de chaves. Por exemplo, TLS 1.3 define combinacións que empregan SHA-256 ou SHA-384 no seu mecanismo de derivación de chaves. O hash forma parte do protocolo, non proporciona por si só todas as súas garantías.
Tamén se distribúen resumos SHA-256 ou SHA-512 para comprobar a integridade de ficheiros. A autenticidade do valor de referencia é importante: a documentación de Debian combina esas comprobacións coa verificación da sinatura dos ficheiros de sumas.
Algúns sistemas empregaron sha512-crypt, un esquema de hash de contrasinais con sal e iteracións baseado en SHA-512. É distinto de calcular unha soa vez o resumo rápido do contrasinal.
Bitcoin emprega SHA-256 no protocolo de identificación e encadeamento dos datos e na procura da proba de traballo. Estas operacións non substitúen a verificación das sinaturas nin as demais regras de validez das transaccións. Sección «Proof Of Work».
Nas redes móbiles 4G e 5G, HMAC-SHA-256 forma parte da función de derivación de chaves definida nas especificacións 3GPP TS 33.401 e TS 33.501.3GPP TS 33.401, Security architecture and procedures for E-UTRAN3GPP TS 33.501, Security architecture and procedures for 5G systems
SHA-256 emprégase na sinatura de mensaxes DKIM e, xunto con SHA-512, en DNSSEC. SHA-512 forma parte dun sistema para autenticar vídeo arquivístico do Tribunal Penal Internacional para Ruanda. Outras criptomoedas adoptaron funcións de proba de traballo diferentes: Litecoin emprega scrypt desde o seu lanzamento en 2011. A elección de scrypt buscaba limitar a vantaxe do hardware especializado, pero posteriormente tamén apareceron ASIC para a súa minaría.
Criptoanálise e validación Nun modelo ideal de resumo uniforme de L bits, a procura xenérica dunha preimaxe ten un custo da orde de 2L avaliacións. A procura dunha colisión aproveita o efecto aniversario, cun custo da orde de 2L/2. Estas son cotas de referencia do modelo ideal, non garantías de que unha función real concreta acade esa resistencia.
Os ataques de colisión non recuperan directamente un contrasinal dado a partir do seu resumo. Porén, os candidatos poden probarse mediante ataques de dicionario ou forza bruta; a resistencia a estes depende do esquema de almacenamento, do sal, do custo e da calidade do contrasinal.
Un ataque de colisión contra un esquema que asina resumos pode preparar dous documentos co mesmo hash, un inocuo e outro prexudicial, e conseguir que se asine o inocuo. Non permite por si só substituír un documento arbitrario xa asinado, o que esixiría unha segunda preimaxe. En 2008 demostrouse a creación dun certificado de autoridade fraudulento mediante unha colisión de MD5, aceptado polos navegadores web afectados.Alexander Sotirov, Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger, MD5 considered harmful today: Creating a rogue CA certificate. , consultado o 29 de marzo de 2009.
A táboa seguinte recolle unha selección de resultados publicados entre 2008 e 2024 contra versións reducidas de SHA-2. As preimaxes, colisións e variantes con parámetros controlados polo atacante son obxectivos diferentes. Algúns resultados son prácticos e outros son melloras teóricas; non equivalen a ataques prácticos contra a función completa.
En FSE 2012, investigadores de Sony presentaron unha comunicación que suxería que os ataques de pseudocolisión poderían estenderse a 52 roldas en SHA-256 e a 57 roldas en SHA-512, a partir do ataque de pseudopreimaxe con bicliques.Ji Li, Takanori Isobe e Kyoji Shibutani, Sony China Research Laboratory e Sony Corporation, Converting Meet-in-the-Middle Preimage Attack into Pseudo Collision Attack: Application to SHA-2 . .
Publicado en Ano Método de ataque Ataque Variante Roldas Complexidade New Collision Attacks Against Up To 24-step SHA-2 2008 Diferencial Colisión SHA-256 24/64 215,5 SHA-512 24/80 222,5 Preimages for step-reduced SHA-2 2009 Meet-in-the-middle Preimaxe SHA-256 42/64 2251,7 43/64 2254,9 SHA-512 42/80 2502,3 46/80 2511,5 Advanced meet-in-the-middle preimage attacks 2010 Meet-in-the-middle Preimaxe SHA-256 42/64 2248,4 SHA-512 42/80 2494,6 Higher-Order Differential Attack on Reduced SHA-256 2011 Diferencial Pseudocolisión SHA-256 46/64 2178 33/64 246 Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family 2011 Biclique Preimaxe SHA-256 45/64 2255,5 SHA-512 50/80 2511,5 Pseudopreimaxe SHA-256 52/64 2255 SHA-512 57/80 2511 Improving Local Collisions: New Attacks on Reduced SHA-256 2013 Diferencial Colisión SHA-256 31/64 265,5 Pseudocolisión SHA-256 38/64 237 Branching Heuristics in Differential Collision Search with Applications to SHA-512 2014 Diferencial heurístico Pseudocolisión SHA-512 38/80 240,5 Analysis of SHA-512/224 and SHA-512/256 2016 Diferencial Colisión SHA-256 28/64 práctica SHA-512 27/80 práctica Pseudocolisión SHA-512 39/80 práctica New Records in Collision Attacks on SHA-2 2024 Diferencial Colisión SHA-256 31/64 249,8 SHA-512 31/80 2115,6 Pseudocolisión SHA-256 39/64 práctica
Validación oficial
O programa CAVP do Instituto Nacional de Estándares e Tecnoloxía (NIST) comproba a conformidade das implementacións de algoritmos. O programa CMVP, xestionado conxuntamente polo NIST e o Communications Security Establishment (CSE), valida módulos criptográficos. Para a verificación informal pódense empregar vectores de proba dispoñibles no sitio do NIST; estas comprobacións non substitúen a validación formal.
En decembro de 2013, había máis de 1300 implementacións validadas de SHA-256 e máis de 900 de SHA-512, das que só 5 eran capaces de manexar mensaxes cunha lonxitude en bits non múltiplo de oito mentres admitían ambas as variantes.
Vectores de proba Valores hash dunha cadea baleira (é dicir, un texto de entrada de lonxitude cero). SHA224("") 0x d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f SHA256("") 0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA384("") 0x 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b SHA512("") 0x cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e SHA512/224("") 0x 6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4 SHA512/256("") 0x c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a
Como exemplo do efecto avalancha, engadir un punto ao final da seguinte frase cambia 112 dos 224 bits do hash. As entradas en galego codifícanse en UTF-8, sen salto de liña final: SHA224("A rápida raposa marrón salta sobre o can preguiceiro") 0x 898a4aa996e71ae71834c203e592ff57b3b3756390636c42995a6042 SHA224("A rápida raposa marrón salta sobre o can preguiceiro.") 0x 3e6912bcb9f844e11fc77136efe15f022a7b8e2f64e02173684da16b
Pseudocódigo A continuación móstrase o pseudocódigo do algoritmo SHA-256. Nótese o gran aumento da mestura entre os bits das palabras w[16..63] en comparación con SHA-1.
Nota 1: Todas as variables son enteiros sen signo de 32 bits e a suma calcúlase módulo 232 Nota 2: Para cada rolda hai unha constante de rolda k[i] e unha entrada na matriz da planificación da mensaxe w[i], 0 ≤ i ≤ 63 Nota 3: A función de compresión usa 8 variables de traballo: a, b, c, d, e, f, g e h. Nota 4: Úsase a convención big-endian ao expresar as constantes neste pseudocódigo, e ao analizar os datos do bloque de mensaxe de bytes a palabras, por exemplo, a primeira palabra da mensaxe de entrada "ola" despois do recheo é 0x6f6c6180
Inicializar os valores hash: (primeiros 32 bits das partes fraccionarias das raíces cadradas dos primeiros 8 primos 2..19): h0 := 0x6a09e667 h1 := 0xbb67ae85 h2 := 0x3c6ef372 h3 := 0xa54ff53a h4 := 0x510e527f h5 := 0x9b05688c h6 := 0x1f83d9ab h7 := 0x5be0cd19
Inicializar a matriz de constantes de rolda: (primeiros 32 bits das partes fraccionarias das raíces cúbicas dos primeiros 64 primos 2..311): k[0..63] := 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
Preprocesamento (recheo): comezar coa mensaxe orixinal de lonxitude L bits engadir un só bit '1' engadir K bits '0', onde K é o número mínimo >= 0 tal que (L + 1 + K + 64) sexa múltiplo de 512 engadir L como un enteiro big-endian de 64 bits, de modo que a lonxitude total tras o procesamento sexa múltiplo de 512 bits de xeito que os bits da mensaxe sexan: 1 , (o número de bits será múltiplo de 512)
Procesar a mensaxe en bloques sucesivos de 512 bits: dividir a mensaxe en bloques de 512 bits for cada bloque crear unha matriz de planificación da mensaxe de 64 entradas w[0..63] de palabras de 32 bits (Os valores iniciais en w[0..63] non importan, polo que moitas implementacións os poñen a cero aquí) copiar o bloque nas primeiras 16 palabras w[0..15] da matriz de planificación da mensaxe
Estender as primeiras 16 palabras nas restantes 48 palabras w[16..63] da matriz de planificación da mensaxe: for i from 16 to 63 s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3) s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10) w[i] := w[i-16] + s0 + w[i-7] + s1
Inicializar as variables de traballo co valor hash actual: a := h0 b := h1 c := h2 d := h3 e := h4 f := h5 g := h6 h := h7
Bucle principal da función de compresión: for i from 0 to 63 S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25) ch := (e and f) xor ((not e) and g) temp1 := h + S1 + ch + k[i] + w[i]