HMAC ( někdy znamená autentizační kód zprávy založený na hash , ověřovací kód zprávy využívající hašovací funkce nebo anglicky keyed-hash message authentication code , ověřovací kód zprávy využívající hašovací funkce s klíčem) — v informatice ( kryptografie ), jeden z mechanismy pro kontrolu integrity informací, aby bylo zajištěno, že data přenášená nebo uložená v nespolehlivém prostředí nebyla změněna neoprávněnými osobami (viz muž uprostřed ). Mechanismus HMAC využívá vkládání zosobnění (MAC) , popsané v RFC 2104 , ve standardech organizací ANSI , IETF , ISO a NIST . MAC je standard, který popisuje způsob výměny dat a způsob kontroly integrity přenášených dat pomocí tajného klíče. Dva klienti používající MAC obvykle sdílejí sdílené tajemství. HMAC - doplněk přes MAC; mechanismus pro výměnu dat pomocí tajného klíče (jako v MAC) a hashovacích funkcí . Název může specifikovat použitou hashovací funkci [1] : HMAC- MD5 , HMAC- SHA1 , HMAC -RIPEMD128 , HMAC- RIPEMD160 atd .
byl zaznamenán[ kým? ] , že hašovací funkce (např . MD5 , SHA-1 , RIPEMD128 , RIPEMD-160 ) jsou obvykle rychlejší než symetrické blokové šifry (např . DES ). V MAC byla touha používat hashovací funkce a dostupnost hotových knihoven s implementacemi různých hashovacích funkcí tuto myšlenku jen posunula.
V MAC ale nebylo možné použít některé hashovací funkce. Například hashovací funkci MD5 nelze použít v MAC, protože vyžaduje pouze jeden argument - data (řetězec, posloupnost bajtů) a nepoužívá tajný klíč.
V červnu 1996 [2] Hugo Krawczyk ( eng. Hugo Krawczyk , zaměstnanec IBM ), Mihir Bellar ( eng. Mihir Bellare , zaměstnanec University of California at San Diego (UCSD) ) a Ran Cannetti ( eng. Ran Canetti , zaměstnanec IBM ) publikoval popis mechanismu HMAC a v únoru 1997 vydali také RFC 2104 . V HMAC byla data „smíchána“ s klíčem a hashovací funkce byla použita dvakrát.
Byly navrženy další mechanismy, které umožňují současné použití dat a tajného klíče v existujících hashovacích algoritmech, ale HMAC získal největší podporu. .
Výhody HMAC:
Mechanismus HMAC byl popsán ve standardech organizací ANSI , IETF , ISO a NIST .
Implementace HMAC je povinná (anglicky povinná implementace ) pro protokol IPsec .
HMAC se také používá v jiných internetových protokolech , jako je TLS .
hashovací funkce H | b, byte | L, byte |
---|---|---|
MD5 | 64 | 16 |
SHA-1 | 64 | dvacet |
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 |
SHA3-224 | 144 | 28 |
SHA3-256 | 136 | 32 |
SHA3-384 | 104 | 48 |
SHA3-512 | 72 | 64 |
out = H( in ) b = length( in ) L = length( out ) |
Algoritmus HMAC lze zapsat jako jeden vzorec [1] : kde:
Schéma algoritmu HMAC je znázorněno na obrázcích.
Kroky algoritmu HMAC jsou uvedeny níže.
Klíče menší než Lbajty jsou považovány [1] za nebezpečné ( důrazně se nedoporučuje ). Doporučuje se [1] vybírat klíče náhodně a pravidelně je měnit. Klíče větší než Lbajty, výrazně nezvyšují [1] sílu funkce, lze je použít, pokud existují pochybnosti o náhodnosti dat použitých k vytvoření klíče a přijatých z generátoru náhodných čísel.
Velikost klíče Кmusí být větší nebo rovna L/2bajtům .
Obrázek ukazuje efektivnější [ zpřesnit ] implementaci algoritmu HMAC-MD5. Implementace se liší v použití F. Tato implementace je užitečná, pokud je většina zpráv, pro které se MAC počítá, krátká. Funkce F− Kompresní funkce pro hashovací funkci H. Jako argumenty Fbere proměnnou na blok délky bbajtů . Frozdělí blok na řetězec odkazů s délkou každého odkazu v nbajtech. Funkce Fje volána jednou pro každou novou klávesu.
Následuje příklad implementace HMAC v pseudokódu :
FUNKCE hmac( key, msg ): // Pokud je velikost klíče větší než velikost bloku ... IF length( key ) > block_size THEN : // Zkraťte klíč na velikost výsledku hashovací funkce klíč = hash (klíč) // (Velikost výsledku hash je obvykle menší než (nerovná se) velikost bloku hash) END_IF // Pokud je klíč menší než velikost bloku hash ... IF length( key ) < block_size THEN : // Doplnění klíče o nulovou sekvenci klíč = klíč ∥ nuly (velikost_bloku - délka (klíč )) // operátor "∥" provede sloučení řetězců (sekvencí bajtů) END_IF ipad = [ '\x36' * block_size ] // operátor "*" udává počet opakování sekvence bajtů, // a block_size - velikost hašovacího funkčního bloku, opad = [ '\x5c' * velikost_bloku ] ikeypad = klávesa ipad ⊕ // operátor "⊕" provádí bitový exkluzivní OR (xor) klávesnice = klávesa opad ⊕ RETURN hash( okeypad ∥ hash( ikeypad ∥ msg ) ) // Operátor "∥" spojuje řetězce END_FUNCTIONPříklad implementace algoritmu HMAC-MD5 pomocí funkcí standardní knihovny Python [3] :
import hmac , hashlib print ( hmac . new ( key = b 'secret_shared_key' , msg = open ( 'message.txt' , 'rb' ) . read (), digestmod = hashlib . md5 ) . hexdigest ())Jedna z možných implementací algoritmu HMAC-MD5 v PHP [4] :
funkce hmac ( $klíč , $data ) { $b = 64 ; // velikost bloku podle RFC 2104 if ( strlen ( $klíč ) > $b ) { $klíč = pack ( "H*" , md5 ( $klíč ) ); } $klíč = str_pad ( $klíč , $b , chr ( 0x00 ) ); $ipad = str_pad ( '' , $b , chr ( 0x36 ) ); $opad = str_pad ( '' , $b , chr ( 0x5c ) ); $k_ipad = $klíč ^ $ipad ; $k_opad = $klíč ^ $opad ; return md5 ( $k_opad . pack ( "H*" , md5 ( $k_ipad . $data ) ) ); }Ukažme si příklad, jak algoritmus funguje pro různá vstupní data.
První parametr je klíč K160 bitů (20 bajtů). Druhým parametrem je zpráva text, která bude odeslána odesílatelem a ověřena příjemcem. Na výstupu získáme autentizační kód 160 bitů.
HMAC( K, text ) = HMAC( 0000000000000000000000000000000000000, "" ) = 740ca4e7a701540b385df12fe57cff57 HMAC( K, text ) = HMAC( 0000000000000000000000000000000000000, "Ahoj světe" ) = a0e026219366a56cf843bd2051831327 HMAC( K, text ) = HMAC( 0000000000000000000000000000000000001, "1" ) = c6b1d8489a204918643086ce346b86bcPodívejme se blíže na algoritmus HMAC- SHA1 s 20bajtovým klíčem.
Máme: textovou zprávu text = "Hello World"a 20bajtový klíč v hexadecimálním tvaruK = 0x707172737475767778797a7b7c7d7e7f80818283
Krok 1. Doplňte klíč Knulovými bajty na velikost bloku. Velikost bloku hašovací funkce SHA-1 je 64 bajtů.K0:
70717273 74757677 78797a7b 7c7d7e7f
80818283 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
K0 ipad :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
( K ipad ) || text :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
48656c6c 6f20576f 726c64
H( ( K ipad ) || text ) :
0d42b899 d804e19e bfd86fc4 4f414045 dfc9e39a
K0 opad :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
( K0 opad ) || H( ( K ipad ) || text ) :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
0d42b899 d804e19e bfd86fc4 4f414045
dfc9e39a
HMAC( K, text ) = H( ( K0 opad ) || H( ( K ipad ) || text ) ) :
2e492768 aa339e32 a9280569 c5d02626 2b912431
Výsledný autentizační kód umožňuje ověřit, že data nebyla žádným způsobem změněna od doby, kdy byla vytvořena, přenesena nebo uložena důvěryhodným zdrojem. Pro tento druh ověření je například nutné, aby se dvě strany, které si navzájem důvěřují, předem dohodly na použití tajného klíče, který znají pouze oni. Tím je zaručena autentičnost zdroje a sdělení. Nevýhoda tohoto přístupu je zřejmá – musí existovat dvě strany, které si navzájem důvěřují.
Zabezpečení jakékoli MAC funkce založené na vestavěných hashovacích funkcích závisí na síle základní hashovací funkce. Zajímavostí HMAC je, že jeho tvůrci dokázali prokázat přesný vztah mezi silou vestavěných hashovacích funkcí a silou HMAC.
Bezpečnost funkce imitace vkládání (MAC) se obvykle vyjadřuje jako pravděpodobnost úspěšného útoku s množstvím času stráveného na něm a také přijetím dvojice (zprávy - MAC) vytvořené stejným klíčem. V BELL96a je v podstatě prokázáno , že pro danou úroveň úsilí (čas, zpráva - MAC) na zprávu generovanou koncovým uživatelem je pravděpodobnost úspěšného útoku na HMAC ekvivalentní útoku na vestavěný hashovací funkce: