HMAC


En la criptografia, un HMAC (a voltes expandit com a còdic d'autentificació de mensages en clau-hash o còdic d'autenticació de mensage basat en hash) és una construcció específica per a calcular un còdic d'autentificació de mensage (MAC) que implica una funció hash criptográfica en combinació en una clau criptográfica secreta. Com qualsevol MAC, pot ser utilisat per a verificar simultàneament la integritat de les senyes i la autentificació d'un mensage. Qualsevol funció hash criptográfica, tals com SHA-2 o SHA-3, pot ser utilisada per al càlcul d'un HMAC; l'algoritme MAC resultant es denomina HMAC-SHA2 o HMAC-SHA3 en conseqüència. La força criptográfica de el HMAC depén de la potència criptográfica de la funció de hash subjacent, el tamany de la seua eixida de hash i el tamany i calitat de la clau.
Una funció hash iterativa trenca un mensage en blocs d'un tamany fix i itera sobre ells en una funció de compressió. Per eixemple, SHA-2 i SHA-3 operen en blocs de 512-bit. El tamany de l'eixida de HMAC és el mateix que el de la funció de hash subjacent (entre 224 i 512 bits en el cas de SHA3 dependent de la configuració).
La definició i l'anàlisis de la construcció HMAC es va publicar per primera volta en 1996 per Mihir Bellare, Ran Canetti i Hugo Krawczyk, que també va escriure el RFC 2104. Aixina mateix, este document definix una variant anomenada NMAC que rara volta, o mai, s'utilisa. FIPS PUB 198 generalisa i estandardisa l'us de HMAC. HMAC-SHA1 i HMAC-MD5 s'utilisen dins dels protocols IPsec i TLS pero no són segurs hui dia.
Definició (de RFC 2104)
[editar | editar còdic]
a on:
- H és una funció hash criptográfica,
- K és una clau secreta reblix a la dreta en zeros adicionals al tamany del bloc d'entrada de la funció hash, o el hash de la clau original si és més llarc que el tamany de bloc,
- m és el mensage a ser autenticado,
- || denota concatenació,
- ⊕ denota disjunció exclusiva (XOR),
- opad és la farcidura exterior (0x5c5c5c…5c5c, un bloc de llarc hexadecimal constant),
- ipad és la farcidura interior (0x363636…3636, un bloc de llarc hexadecimal constant).
Implementació
[editar | editar còdic]El següent pseudocódigo mostra cóm es pot implementar HMAC. El tamany del bloc és de 64 (bytes) quan s'utilisa una de les següents funcions hash: SHA-1, MD5, RIPEMD-128/160.[1]
function hmac (key, message)
if (length(key) > blocksize) then
key = hash(key) // claus en més tamany que el bloc s'acurten al tamany just aplicant hash a eixes claus
end if
if (length(key) < blocksize) then
key = key ∥ [0x00 * (blocksize - length(key))] // claus més curtes que el tamany del bloc s'engrandixen en zeros (a on ∥ és la concatenació)
end if
o_key_pad = [0x5c * blocksize] ⊕ key // Quan el tamany del bloc és el de la funció de hash subjacent
i_key_pad = [0x36 * blocksize] ⊕ key // A on ⊕ és l'o exclusiu (XOR)
return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // A on ∥ és la concatenació
end function
El següent és una implementació en Python de HMAC-MD5:
#!/usr/bin/env python
from hashlib import md5
trans_5C = bytearray((x ^ 0x5c) for x in range(256))
trans_36 = bytearray((x ^ 0x36) for x in range(256))
blocksize = md5().block_size # 64
def hmac_md5(key, msg):
if len(key) > blocksize:
key = md5(key).digest()
key = key + bytearray(blocksize - len(key))
o_key_pad = key.translate(trans_5C)
i_key_pad = key.translate(trans_36)
return md5(o_key_pad + md5(i_key_pad + msg).digest())
if __name__ == "__main__":
# Est és un eixemple de l'apèndix de la RFC 2104
h = hmac_md5(b"Cap", b"what do ya want for nothing?")
print(h.hexdigest()) # 750c783i6ab0b503eaa86i310a5db738Python inclou un mòdul hmac,[2] per lo que la funció anterior pot ser reemplaçada per una versió més curta.
import hmac
from hashlib import md5
def hmac_md5(key, msg):
return hmac.HMAC(key, msg, md5)El següent còdic és una implementació en PHP de HMAC-SHA1:
function sha1_hmac($key,$data,$blockSize=64,$opad=0x5c,$ipad=0x36) {
// Claus de més tamany que el bloc s'acurten
if (strlen($key) > $blockSize) {
$key = sha1($key,true);
}
// Claus més curtes que el tamany de bloc són reblides en zeros a la dreta (concatenat)
$key = str_pad($key,$blockSize,chr(0x00),STR_PAD_RIGHT);
$o_key_pad = $i_key_pad = '';
for($i = 0;$i < $blockSize;$i++) {
$o_key_pad .= chr(ord(substr($key,$i,1)) ^ $opad);
$i_key_pad .= chr(ord(substr($key,$i,1)) ^ $ipad);
}
return sha1($o_key_pad.sha1($i_key_pad.$data,true),true);
}
$hmac = sha1_hmac('key','The quick brown fox jumps over the lazy dog');PHP inclou una funció HMAC,[3] per lo que l'eixemple anterior pot ser reemplaçat per una versió més curta.
<?php
hash_hmac('sha1', 'The quick brown fox jumps over the lazy dog', 'key');La següent és una implementació usant QCryptographicHash de Qt <syntaxhighlight lang="cpp"> QByteArray hmacSha256(QByteArray key, const QByteArray& message) { const int blocksize = 64; if (key.length() > blocksize) QCryptographicHash::hash(key, QCryptographicHash::Sha256);
while (key.length() < blocksize) key.append('
Referències
[editar | editar còdic]- ↑ RFC 2104, section 2, "Definition of HMAC", page 3.
- ↑ «hmac — Keyed-Hashing for Message Authentication».Python Software Foundation.Consultat el 7 de maig de 2014.
- ↑ «PHP: hash_hmac - Manual».The PHP Group.Consultat el 13 de setembre de 2015.
- Este artícul conté una traducció derivada de «HMAC» de Wikipedia en castellà publicada baix la Llicència de documentació lliure de GNU i la Llicència Creative Commons Reconeiximent-CompartirIgual 4.0 Internacional.