SHA-1 (Secure Hash Algorithm 1) é unha función hash criptográfica que produce resumos de 160 bits. Foi publicada en 1995 como revisión do algoritmo SHA de 1993, coñecido posteriormente como SHA-0.
A súa resistencia a colisións está comprometida na práctica: en 2017 publicouse unha colisión do hash completo e en 2020 unha colisión práctica de prefixo escollido. Isto afecta especialmente usos como sinaturas e certificados, e debe distinguirse da procura dunha preimaxe ou da análise dunha construción con chave como HMAC.
O NIST estableceu a retirada de SHA-1 da xeración de novas sinaturas dixitais, mantendo durante a transición a verificación de sinaturas antigas. Esta distinción non equivale a unha prohibición inmediata de todos os usos da función. En 2022 fixou a súa retirada dos usos de protección criptográfica ao remate de 2030 e recomendou a transición a SHA-2 ou SHA-3. Os principais navegadores deixaron de aceptar certificados SSL con SHA-1 en 2017.
Desenvolvemento miniatura|dereita|300px|alt=Esquema dunha rolda de SHA-1 con cinco palabras de estado, operacións lóxicas, rotacións e sumas.|Unha iteración dentro da función de compresión de SHA-1: A, B, C, D e E son palabras de 32 bits do estado; F é unha función lóxica que depende do grupo de roldas; a rotación de bits á esquerda en n posicións varía en cada operación; Wt é a palabra expandida da mensaxe na rolda t; Kt é a constante da rolda t; a suma indica adición módulo 232.
SHA-1 baséase en principios semellantes aos empregados por Ronald L. Rivest do MIT no deseño dos algoritmos de resumo de mensaxe MD4 e MD5, pero xera un resumo maior (160 bits fronte a 128 bits).
SHA-1 desenvolveuse como parte do proxecto Capstone do Goberno dos Estados Unidos. A especificación orixinal do algoritmo publicouse en 1993 co título Secure Hash Standard, FIPS PUB 180, pola axencia de estándares do Goberno dos Estados Unidos, o NIST (Instituto Nacional de Estándares e Tecnoloxía). Esta versión denomínase hoxe a miúdo SHA-0. Foi retirada pola NSA pouco despois da súa publicación e substituída pola versión revisada, publicada en 1995 como FIPS PUB 180-1 e designada comunmente como SHA-1. SHA-1 difire de SHA-0 só nunha rotación dun bit na planificación da mensaxe da súa función de compresión unidireccional. Segundo a NSA, isto fíxose para corrixir un defecto do algoritmo orixinal que reducía a súa seguridade criptográfica, mais non ofreceron máis explicacións. As técnicas dispoñibles publicamente demostraron, en efecto, unha vulneración de SHA-0 en 2004, antes que a de SHA-1 en 2017 (véxase análise de ataques).
Aplicacións Criptografía SHA-1 empregouse en sinaturas, certificados e protocolos de comunicación. A aparición de colisións prácticas motivou a retirada deses usos, especialmente cando a resistencia a colisións era necesaria. A verificación de sinaturas antigas e a xeración de sinaturas novas teñen requisitos de transición diferentes; a especificación do algoritmo non implica que siga sendo adecuado para calquera uso.
Unha construción con chave, como HMAC-SHA-1, debe analizarse separadamente da función sen chave. Os ataques de colisión coñecidos non equivalen por si sós a unha falsificación de HMAC; a seguridade tamén depende da construción, da chave e da lonxitude da etiqueta.
Microsoft retirou o 3 de agosto de 2020 o soporte de sinatura de código SHA-1 para Windows Update, o que tamén puxo fin na práctica aos servidores de actualización das versións de Windows que non se actualizaran a SHA-2.
Control de versións Git empregou SHA-1 para identificar obxectos, detectar cambios e vincular referencias de contido. A confianza en identificadores e obxectos asinados tamén depende da resistencia do hash a ataques. O proxecto incorporou detección de determinados ataques de colisión e desenvolveu a transición a SHA-256; conservar o primeiro obxecto recibido non é unha garantía xeral fronte a calquera ataque.
Criptoanálise e validación Nun modelo ideal de resumo uniforme de n bits, a busca xenérica dunha preimaxe ten un custo da orde de 2 elevado a n, mentres que a busca dunha colisión ten un custo da orde de 2 elevado a (n/2). Son problemas diferentes: obter dúas entradas que colisionen non significa recuperar unha mensaxe concreta a partir do seu resumo.
SHA-0 Chabaud e Joux publicaron en 1998 un ataque diferencial contra SHA-0 cun custo menor que a procura xenérica de colisións. Traballos posteriores melloraron esa análise e obtiveron colisións prácticas; en 2008 Manuel e Peyrin describiron un método que permitía calculalas nunha hora no equipamento de referencia utilizado.
Ataques contra SHA-1 En 2005 publicáronse ataques teóricos que reducían o custo estimado de obter unha colisión de SHA-1 completo por debaixo do ataque xenérico de aniversario. Tamén se obtiveron colisións en versións cun número reducido de roldas. É necesario distinguir estas estimacións e variantes das colisións efectivamente calculadas sobre o hash completo.
O SHAppening En outubro de 2015, Marc Stevens, Pierre Karpman e Thomas Peyrin presentaron unha colisión freestart da función de compresión de 80 roldas, cun custo da orde de 2 elevado a 57 avaliacións. Neste modelo o atacante pode escoller o estado inicial; non é unha colisión de SHA-1 co valor inicial fixado polo estándar.
SHAttered En febreiro de 2017, o CWI Amsterdam e Google anunciaron SHAttered, que produciu dous ficheiros PDF distintos co mesmo resumo SHA-1. O custo comunicado foi de aproximadamente 2 elevado a 63,1 avaliacións, moi inferior á procura xenérica de aniversario. Foi unha demostración práctica de colisión no hash completo.
Colisións de prefixo escollido Un ataque de prefixo escollido permite partir de dous prefixos diferentes e construír sufixos que fan coincidir os resumos. En EUROCRYPT 2019, Gaëtan Leurent e Thomas Peyrin describiron un método cun custo estimado da orde de 2 elevado a 68 para SHA-1. En 2020 publicaron unha mellora e unha demostración práctica, denominada SHA-1 is a Shambles, cun custo estimado da orde de 2 elevado a 63,4 para ese tipo de colisión.
Extensión de lonxitude SHA-1 expón o estado final da súa construción iterada. Co resumo e coa lonxitude axeitada pódese continuar o cálculo para unha extensión que inclúa o recheo. Esta é unha razón pola que H(chave || mensaxe) non substitúe un mecanismo de autenticación analizado como HMAC.
Validación oficial O programa CAVP do NIST comproba a conformidade de implementacións de algoritmos; o CMVP valida módulos criptográficos e ten un ámbito distinto. Pasar vectores de proba ou validar unha implementación non demostra que o algoritmo sexa resistente aos ataques coñecidos nin que estea permitido para calquera aplicación.
Exemplos e pseudocódigo Hashes de exemplo Son exemplos de resumos de mensaxe SHA-1 en hexadecimal e en codificación de binario a texto Base64. As frases en galego codifícanse en UTF-8, sen salto de liña final.
SHA1("A rápida raposa marrón salta sobre o can preguiceiro") Saída en hexadecimal: e0f352f8d287937c678a0b94bed960f3fada7d2f Saída en codificación de binario a texto Base64: 4PNS+NKHk3xniguUvtlg8/rafS8=
Mesmo un pequeno cambio na mensaxe producirá, cunha probabilidade moi alta, cambios en moitos bits debido ao efecto avalancha. Por exemplo, cambiar can por gato produce un hash con valores diferentes en 82 dos 160 bits:
SHA1("A rápida raposa marrón salta sobre o gato preguiceiro") Saída en hexadecimal: 01d0f57eb9cc0a5212479c20df9d0a910e7dea02 Saída en codificación de binario a texto Base64: AdD1frnMClISR5wg350KkQ596gI=
O hash da cadea de lonxitude cero é:
SHA1("") Saída en hexadecimal: da39a3ee5e6b4b0d3255bfef95601890afd80709 Saída en codificación de binario a texto Base64: 2jmj7l5rSw0yVb/vlWAYkK/YBwk=
Pseudocódigo de SHA-1 O seguinte esquema resume as operacións de SHA-1. A entrada xeral é unha cadea de bits; a codificación de texto, cando se emprega, realízase antes do algoritmo.
Entrada: unha cadea de bits m, de lonxitude L menor que 2^64. As palabras de traballo e de estado son de 32 bits; as súas sumas calcúlanse módulo 2^32. A lonxitude L represéntase en 64 bits. ROTL(x, n) é a rotación circular de x cara á esquerda en n posicións.
Engadir un bit 1 a m. Engadir k bits 0, co menor k >= 0 que faga L + 1 + k = 448 (mod 512). Engadir a representación de L en 64 bits, coa orde de bytes máis significativo primeiro.
h0 = 0x67452301 h1 = 0xefcdab89 h2 = 0x98badcfe h3 = 0x10325476 h4 = 0xc3d2e1f0
Para cada bloque de 512 bits: Interpretar o bloque como 16 palabras w, ..., w, coa orde de bytes máis significativo primeiro. Para i de 16 a 79: w[i] = ROTL(w[i-3] XOR w[i-8] XOR w[i-14] XOR w[i-16], 1)
(a, b, c, d, e) = (h0, h1, h2, h3, h4) Para i de 0 a 79: Se i < 20: f = (b AND c) OR ((NOT b) AND d) K = 0x5a827999 Se 20 <= i < 40: f = b XOR c XOR d K = 0x6ed9eba1 Se 40 <= i < 60: f = (b AND c) OR (b AND d) OR (c AND d) K = 0x8f1bbcdc Se 60 <= i < 80: f = b XOR c XOR d K = 0xca62c1d6 temp = (ROTL(a, 5) + f + e + K + w[i]) mod 2^32 e = d d = c c = ROTL(b, 30) b = a a = temp (h0, h1, h2, h3, h4) = (h0+a, h1+b, h2+c, h3+d, h4+e) mod 2^32
Saída: concatenar h0, h1, h2, h3 e h4 na orde de bytes máis significativo primeiro.
Comparación das funcións SHA As lonxitudes e a estrutura son parámetros dos algoritmos; non expresan por si soas a seguridade de todas as súas aplicacións. MD5 inclúese como referencia histórica. Os algoritmos SHA están especificados nos estándares FIPS correspondentes.
+ Estrutura das funcións SHA (MD5 inclúese como referencia) Algoritmo e variante Saída (bits) Estado interno (bits) Bloque (bits) Roldas Operacións Primeira publicación MD5 128 128 (4 × 32) 512 4 (16 operacións por rolda) And, Xor, Or, Rot, suma módulo 232 1992 SHA-0 160 160 (5 × 32) 512 80 And, Xor, Or, Rot, suma módulo 232 1993 SHA-1 160 160 (5 × 32) 512 80 And, Xor, Or, Rot, suma módulo 232 1995 SHA-224 / SHA-256 224 / 256 256 (8 × 32) 512 64 And, Xor, Or, Rot, Shr, suma módulo 232 2004 / 2001 SHA-384 384 512 (8 × 64) 1024 80 And, Xor, Or, Rot, Shr, suma módulo 264 2001 SHA-512 512 512 (8 × 64) 1024 80 And, Xor, Or, Rot, Shr, suma módulo 264 2001 SHA-512/224 e SHA-512/256 224 / 256 512 (8 × 64) 1024 80 And, Xor, Or, Rot, Shr, suma módulo 264 2012 SHA3-224 / SHA3-256 / SHA3-384 / SHA3-512 224 / 256 / 384 / 512 1600 (5 × 5 × 64) 1152 / 1088 / 832 / 576 24 And, Xor, Rot, Not 2015 SHAKE128 / SHAKE256 d (arbitraria) 1600 (5 × 5 × 64) 1344 / 1088 24 And, Xor, Rot, Not 2015
SHA-0 e SHA-1 teñen colisións prácticas coñecidas. Nas familias SHA-2 e SHA-3, unha saída de n bits ofrece como referencia unha resistencia xenérica clásica a colisións da orde de 2 elevado a (n/2), se non hai ataques mellores. Nos XOF SHAKE a lonxitude de saída tamén se escolle como parámetro; non se debe interpretar o nome como unha lonxitude fixa do resumo.
Implementacións A continuación figura unha lista de bibliotecas criptográficas que admiten SHA-1:
Botan Bouncy Castle cryptlib Crypto++ Libgcrypt Mbed TLS Nettle LibreSSL OpenSSL GnuTLS
A aceleración por hardware proporciónana as seguintes extensións de procesador:
Extensións SHA de Intel: dispoñibles nalgúns procesadores x86 de Intel e AMD. VIA PadLock IBM z/Architecture: dispoñible desde 2003 como parte da extensión Message-Security-Assist. IBM z/Architecture Principles of Operation, publicación SA22-7832. Véxanse as instrucións KIMD e KLMD no capítulo 7.
Contramedida contra colisións Tras o SHAttered, Marc Stevens e Dan Shumow publicaron «sha1collisiondetection» (SHA-1CD), que detecta os patróns de determinados ataques de colisión coñecidos. No modo de hash seguro modifica a saída cando detecta eses patróns. Os autores estiman unha probabilidade de falsos positivos inferior a 2−90. Esta contramedida non garante detectar calquera ataque de colisión posible. GitHub emprega SHA-1CD desde marzo de 2017 e Git desde a versión 2.13.0 de maio de 2017.
Notas
Véxase tamén Bibliografía