HMAC

En criptografia, un HMAC (de vegades ampliat com a codi d'autenticació de missatges amb hash clau o codi d'autenticació de missatges basat en hash) és un tipus específic de codi d'autenticació de missatges (MAC) que implica una funció hash criptogràfica i una clau criptogràfica secreta. Com qualsevol MAC, es pot utilitzar per verificar simultàniament la integritat de les dades i l'autenticitat d'un missatge. Un HMAC és un tipus de funció hash amb clau que també es pot utilitzar en un esquema de derivació de claus o un esquema d'estirament de claus.
L'HMAC pot proporcionar autenticació mitjançant un secret compartit en lloc d'utilitzar signatures digitals amb criptografia asimètrica. Elimina la necessitat d'una infraestructura de clau pública complexa delegant l'intercanvi de claus a les parts comunicants, que són responsables d'establir i utilitzar un canal de confiança per acordar la clau abans de la comunicació.
Detalls
[modifica]Qualsevol funció hash criptogràfica, com ara SHA-2 o SHA-3, es pot utilitzar en el càlcul d'un HMAC; l'algoritme MAC resultant s'anomena HMAC -x, on x és la funció hash utilitzada (per exemple, HMAC-SHA256 o HMAC-SHA3-512). La força criptogràfica de l'HMAC depèn de la força criptogràfica de la funció hash subjacent, la mida de la seva sortida hash i la mida i la qualitat de la clau.[1]
L'HMAC utilitza dues passes de càlcul hash. Abans de qualsevol passada, la clau secreta s'utilitza per obtenir dues claus: una interna i una externa. A continuació, la primera passada de l'algoritme hash produeix un hash intern derivat del missatge i de la clau interna. La segona passada produeix el codi HMAC final derivat del resultat del hash intern i la clau externa. Així, l'algoritme proporciona una millor immunitat contra els atacs d'extensió de longitud.
Una funció hash iterativa (que utilitza la construcció de Merkle-Damgård) divideix un missatge en blocs d'una mida fixa i itera sobre ells amb una funció de compressió. Per exemple, SHA-256 funciona en blocs de 512 bits. La mida de la sortida de HMAC és la mateixa que la de la funció hash subjacent (per exemple, 256 i 512 bits en el cas de SHA-256 i SHA3-512, respectivament), tot i que es pot truncar si es desitja.
L'HMAC no xifra el missatge. En comptes d'això, el missatge (xifrat o no) s'ha d'enviar juntament amb el hash HMAC. Les parts amb la clau secreta tornaran a aplicar el hash al missatge, i si és autèntic, els hash rebuts i calculats coincidiran.
La definició i l'anàlisi de la construcció HMAC es va publicar per primera vegada el 1996 en un article de Mihir Bellare, Ran Canetti i Hugo Krawczyk,[2][3] i també van escriure la RFC 2104 el 1997. L'article de 1996 també va definir una variant imbricada anomenada NMAC (Nested MAC). FIPS PUB 198 generalitza i estandarditza l'ús dels HMAC.[4] HMAC s'utilitza dins dels protocols IPsec,[3] SSH i TLS i per a testimonis web JSON.
Definició
[modifica]Aquesta definició està extreta de la RFC 2104:
on
- és una funció hash criptogràfica.
- és el missatge que s'ha d'autenticar.
- és la clau secreta.
- és una clau de la mida d'un bloc derivada de la clau secreta, K ; ja sigui afegint zeros a la dreta fins a la mida del bloc, o bé aplicant un hash fins a una mida inferior o igual a la mida del bloc primer i després afegint zeros a la dreta.
- denota concatenació.
- denota exclusiu bit a bit o (XOR).
- és el farciment exterior de la mida d'un bloc, que consisteix en bytes repetits amb el valor 0x5c.
- és el farciment intern de la mida d'un bloc, que consisteix en bytes repetits amb el valor 0x36.
Funció hash H
|
b , bytes
|
L , bytes
|
---|---|---|
MD5 | 64 | 16 |
SHA-1 | 64 | 20 |
SHA-224 | 64 | 28 |
SHA-256 | 64 | 32 |
SHA-512/224 | 128 | 28 |
SHA-512/256 | 128 | 32 |
SHA-384 | 128 | 48 |
SHA-512 | 128 | 64[5] |
SHA3-224 | 144 | 28 |
SHA3-256 | 136 | 32 |
SHA3-384 | 104 | 48 |
SHA3-512 | 72 | 64[6] |
out = H(in)
|
Implementació
[modifica]El següent pseudocodi demostra com es pot implementar HMAC. La mida del bloc és de 512 bits (64 bytes) quan s'utilitza una de les funcions hash següents: SHA-1, MD5, RIPEMD-128.
function hmac is
input:
key: Bytes // Array of bytes
message: Bytes // Array of bytes to be hashed
hash: Function // The hash function to use (e.g. SHA-1)
blockSize: Integer // The block size of the hash function (e.g. 64 bytes for SHA-1)
// Compute the block sized key
block_sized_key = computeBlockSizedKey(key, hash, blockSize)
o_key_pad ← block_sized_key xor [0x5c blockSize] // Outer padded key
i_key_pad ← block_sized_key xor [0x36 blockSize] // Inner padded key
return hash(o_key_pad ∥ hash(i_key_pad ∥ message))
function computeBlockSizedKey is
input:
key: Bytes // Array of bytes
hash: Function // The hash function to use (e.g. SHA-1)
blockSize: Integer // The block size of the hash function (e.g. 64 bytes for SHA-1)
// Keys longer than blockSize are shortened by hashing them
if (length(key) > blockSize) then
key = hash(key)
// Keys shorter than blockSize are padded to blockSize by padding with zeros on the right
if (length(key) < blockSize) then
return Pad(key, blockSize) // Pad key with zeros to make it blockSize bytes long
return key
Principis de disseny
[modifica]El disseny de l'especificació HMAC va ser motivat per l'existència d'atacs a mecanismes més trivials per combinar una clau amb una funció hash. Per exemple, es podria suposar que la mateixa seguretat que proporciona HMAC es podria aconseguir amb MAC = H (clau ∥ missatge). Tanmateix, aquest mètode pateix un defecte greu: amb la majoria de funcions hash, és fàcil afegir dades al missatge sense conèixer la clau i obtenir una altra MAC vàlida ("atac d'extensió de longitud"). L'alternativa, afegir la clau utilitzant MAC = H ( missatge ∥ clau ), té el problema que un atacant que pot trobar una col·lisió a la funció hash (sense clau) té una col·lisió a la MAC (ja que dos missatges m1 i m2 que produeixen el mateix hash proporcionaran la mateixa condició d'inici a la funció hash abans que es sumi la clau afegida, per tant, el hash final serà el mateix). Utilitzar MAC = H (clau ∥ missatge ∥ clau) és millor, però diversos articles de seguretat han suggerit vulnerabilitats amb aquest enfocament, fins i tot quan s'utilitzen dues claus diferents.[7]
No s'han trobat atacs d'extensió coneguts contra l'especificació HMAC actual, que es defineix com a H ( clau ∥ H ( clau ∥ missatge )), perquè l'aplicació externa de la funció hash emmascara el resultat intermedi del hash intern. Els valors d' ipad i opad no són crítics per a la seguretat de l'algoritme, però es van definir de manera que tinguessin una gran distància de Hamming entre si i, per tant, les claus interna i externa tindran menys bits en comú. La reducció de seguretat de HMAC requereix que siguin diferents en almenys un bit.
La funció hash de Keccak, que va ser seleccionada pel NIST com a guanyadora de la competició SHA-3, no necessita aquest enfocament imbricat i es pot utilitzar per generar una MAC simplement anteposant la clau al missatge, ja que no és susceptible a atacs d'extensió de longitud.[8]
Seguretat
[modifica]La força criptogràfica de l'HMAC depèn de la mida de la clau secreta que s'utilitza i de la seguretat de la funció hash subjacent utilitzada. S'ha demostrat que la seguretat d'una construcció HMAC està directament relacionada amb les propietats de seguretat de la funció hash utilitzada. L'atac més comú contra els HMAC és la força bruta per descobrir la clau secreta. Els HMAC es veuen substancialment menys afectats per les col·lisions que els seus algoritmes de resum subjacents per si sols.[9][10] En particular, Mihir Bellare va demostrar que HMAC és una funció pseudoaleatòria (PRF) sota la suposició única que la funció de compressió és una PRF. Per tant, HMAC-MD5 no pateix les mateixes debilitats que s'han trobat a MD5.
L'RFC 2104 requereix que "les claus més llargues que B bytes es sometin primer a un hash mitjançant H ", cosa que porta a una pseudocol·lisió confusa: si la clau és més llarga que la mida del bloc de hash (per exemple, 64 bytes per a SHA-1), aleshores HMAC(k, m)
es calcula com HMAC(H(k), m)
. Aquesta propietat de vegades es planteja com una possible debilitat de HMAC en escenaris de hash de contrasenyes: s'ha demostrat que és possible trobar una cadena ASCII llarga i un valor aleatori el hash del qual també serà una cadena ASCII, i tots dos valors produiran la mateixa sortida HMAC.[11][12][13]
El 2006, Jongsung Kim, Alex Biryukov, Bart Preneel i Seokhie Hong van mostrar com distingir un HMAC amb versions reduïdes de MD5 i SHA-1 o versions completes de HAVAL, MD4 i SHA-0 d'una funció aleatòria o un HMAC amb una funció aleatòria. Els distintors diferencials permeten a un atacant dissenyar un atac de falsificació contra HMAC. A més, els distintius diferencials i rectangulars poden provocar atacs de segona preimatge. Amb aquest coneixement es pot forjar HMAC amb la versió completa de MD4. Aquests atacs no contradiuen la prova de seguretat de l'HMAC, però proporcionen informació sobre l'HMAC basada en les funcions hash criptogràfiques existents.[14]
El 2009, Xiaoyun Wang et al. van presentar un atac distintiu contra HMAC-MD5 sense utilitzar claus relacionades. Pot distingir una instanciació de HMAC amb MD5 d'una instanciació amb una funció aleatòria amb 297 consultes amb probabilitat 0,87.
El 2011 es va publicar una RFC 6151 informativa per resumir les consideracions de seguretat en MD5 i HMAC-MD5. Per a HMAC-MD5, la RFC resumeix que, tot i que la seguretat de la funció hash MD5 en si mateixa està greument compromesa, els "atacs actualment coneguts a HMAC-MD5 no semblen indicar una vulnerabilitat pràctica quan s'utilitza com a codi d'autenticació de missatges", però també afegeix que "per a un nou disseny de protocol, no s'hauria d'incloure un conjunt de xifratge amb HMAC-MD5".
El maig de 2011 es va publicar la RFC 6234 que detallava la teoria abstracta i el codi font dels HMAC basats en SHA.
Exemples
[modifica]Aquí teniu alguns valors HMAC, assumint ASCII de 8 bits per a l'entrada i codificació hexadecimal per a la sortida:
HMAC_MD5("key", "The quick brown fox jumps over the lazy dog") = 80070713463e7749b90c2dc24911e275 HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog") = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 HMAC_SHA512("key", "The quick brown fox jumps over the lazy dog") = b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
Referències
[modifica]- ↑ Bellare, Mihir. «Keying Hash Functions for Message Authentication» (en anglès) p. 1–15.
- ↑ Bellare, Mihir. «Keying Hash Functions for Message Authentication» (en anglès) p. 1–15.
- ↑ 3,0 3,1 Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo CryptoBytes, 2, 1, Spring 1996.
- ↑ Federal Information Processing Standards, 16-07-2008.
- ↑ «FIPS 180-2 with Change Notice 1» (en anglès). csrc.nist.gov.
- ↑ Dworkin, Morris Federal Information Processing Standards, 04-08-2015.
- ↑ Bellare, Mihir. «Keying Hash Functions for Message Authentication» (en anglès) p. 1–15.
- ↑ Keccak team. «Keccak Team – Design and security» (en anglès). [Consulta: 31 octubre 2019].
- ↑ Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo CryptoBytes, 2, 1, Spring 1996.
- ↑ Schneier, Bruce. «SHA-1 Broken» (en anglès), 01-08-2005. [Consulta: 9 gener 2009].
- ↑ «PBKDF2+HMAC hash collisions explained · Mathias Bynens» (en anglès). mathiasbynens.be. [Consulta: 7 agost 2019].
- ↑ «Aaron Toponce : Breaking HMAC» (en anglès americà). [Consulta: 7 agost 2019].
- ↑ «RFC 2104 Errata Held for Document Update · Erdem Memisyazici» (en anglès). www.rfc-editor.org. [Consulta: 23 setembre 2016].
- ↑ Jongsung, Kim; Biryukov, Alex; Preneel, Bart; Hong, Seokhie SCN 2006, 2006.