HMAC

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 31. srpna 2017; kontroly vyžadují 38 úprav .

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 .  

Historie

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 .

Aplikace

Implementace HMAC je povinná (anglicky povinná  implementace ) pro protokol IPsec .

HMAC se také používá v jiných internetových protokolech , jako je TLS .

Popis algoritmu

Notový zápis
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.

  1. Získejte snížením nebo zvýšením klíče na velikost bloku (až bajtů).K0Kb
1.1. Pokud se délka klíče Krovná velikosti bloku, zkopírujte Kdo beze změn a přejděte ke kroku 2.K0 IF délka ( K ) == b THEN  : K_0 = K END_IF 1.2. Pokud je délka klíče Květší než velikost bloku, použijeme Khashovací funkci na klíč H, získáme Lřetězec o velikosti bajtů, přidáme nuly na pravou stranu tohoto řetězce a vytvoříme řetězec o bvelikosti bajtů, zkopírujeme výsledek do a přejděte ke kroku 2.K0 IF délka ( K ) > b THEN  : x = H(K) // délka (x) == L K_0 = nuly (x, b - L) END_IF 1.3. Pokud je délka klíče Kmenší než velikost bloku, přidejte nuly na pravou stranu K, abyste vytvořili břetězec o velikosti bajtů, zkopírujte výsledek do (například if (v bajtech) a (v bajtech), pak null bytes ( ) se přidá na pravou stranu ) a přejděte ke kroku 2.K0length( К ) = 20b = 64К64 - 20 = 440x00 IF délka ( K ) < b THEN  : K_0 = nuly ( K, b - délka ( K ) ) END_IF
  1. Získejte blok o velikosti bajtů pomocí bitové operace XOR ("xor", " " ):Sib
S i = xor( Ko , ipad ) = K 0 ipad.
  1. Získejte blok o velikosti bajtů pomocí bitové operace XOR :Sob
So = xor ( Ko, opad ) = K 0 opad.
  1. Rozdělit zprávu (data, sadu bajtů) textna bloky velikosti bbajtů.
  2. Ke každému bloku zprávy přilepte řetězec (sekvenci bajtů) .SiМ
  3. Použijte hashovací funkci na řetězec získaný v předchozím kroku Н.
  4. Sloučit řetězec s řetězcem získaným z hashovací funkce v předchozím kroku.SoH
  5. Použijte hashovací funkci na řetězec získaný v předchozím kroku Н.

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.

Pseudokód

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_FUNCTION

Příklady kódu

Pří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 ) ) ); }

Příklady prací

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" ) = c6b1d8489a204918643086ce346b86bc

Podí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

Krok 2. Provedeme bitovou operaci XOR s konstantou 0x36.

K0 ipad :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636

Krok 3. Původní zprávu slepíme řetězcem přijatým v kroku 2.

( K ipad ) || text :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
48656c6c 6f20576f 726c64

Krok 4. Použijte hashovací funkci SHA-1 na řetězec získaný v předchozím kroku.

H( ( K ipad ) || text ) :
0d42b899 d804e19e bfd86fc4 4f414045 dfc9e39a

Krok 5. Proveďte bitovou operaci XOR s konstantou 0x5c.

K0 opad :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c

Krok 6. Spojení provázku získaného v kroku 4 s provázkem získaným v kroku 5.

( 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

Krok 7. Použijte hashovací funkci SHA-1 na řetězec získaný v předchozím kroku.

HMAC( K, text ) = H( ( K0 opad ) || H( ( K ipad ) || text ) ) :
2e492768 aa339e32 a9280569 c5d02626 2b912431

Výsledek. Máme řetězec HMAC( K, text )20 bajtů.

Problémy s používáním

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í

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:

  1. V prvním typu útoku můžeme kompresní funkce F považovat za ekvivalentní hašovací funkci aplikované na zprávu sestávající z jednoho bloku o délce B bitů. Za tímto účelem je vstupem hašovací funkce náhodná hodnota délky N bitů. Útok na hashovací funkci vyžaduje buď vyčerpávající prohledání klíče, který má úroveň složitosti objednávky , nebo útok „narozeniny“ , což je speciální případ druhého útoku, jak je uvedeno níže.
  2. Při druhém typu útoku útočník hledá dvě zprávy Мa М', které jsou získány ze stejné hashovací funkce: H( M ) = H( M' ). Tento typ útoku je také známý jako narozeninový útok . Úroveň obtížnosti tohoto útoku je pro hash délky . Na základě toho je bezpečnost hashovací funkce MD5 zpochybňována, protože úroveň složitosti pro ni , která již nevypadá jako nemožné s modernímin[ kdy? ] technologie. Znamená to, že 128bitová hašovací funkce, jako je MD5, není vhodná pro HMAC? Odpověď na tuto otázku zní ne, což vyplyne z následujících argumentů . Při útoku na MD5 si útočník může vybrat libovolnou sadu zpráv a pracovat offline, aby našel kolize. Vzhledem k tomu, že útočník zná hashovací algoritmus a počáteční podmínky, může útočník vytvořit hash kód pro každou ze zpráv. Při útoku na HMAC však útočník nebude schopen vygenerovat pár („zprávu“, „kód“) ve vzdáleném (offline) režimu, protože útočník nezná klíč K. Útočník tedy musí sledovat sled zpráv generovaných HMAC se stejným klíčem a provést na ně útok. Hash kód 128 bitů vyžaduje bloky nebo bity generované stejným klíčem. Pro 1 Gbit připojení by člověk musel sledovat tok zpráv, pokud se klíč nezmění, po dobu 150 000 let, aby uspěl. Pokud je tedy rychlost podstatná, je naprosto přijatelné použít MD5 spíše než SHA-1 jako vestavěné hashovací funkce pro HMAC.K

Viz také

Zdroje

  • Black W. Internetové bezpečnostní protokoly. Moskva: nakladatelství "Peter". 2001. ISBN 5-318-00002-9 (původní anglické ISBN: ISBN 0-13-014249-2 ).
  • RFC 2104 . Krawczyk H., Bellare M., Canetti R. "HMAC: Keyed-hashing for message authentication". února 1997
  • Stallings W. Principy a postupy kryptografie a zabezpečení sítě. 2005. ISBN 0-13-187316-4 .

Poznámky

  1. 1 2 3 4 5 6 7 Krawczyk H., Bellare M., Canetti R. "HMAC: Keyed-hashing for message authentication". RFC 2104 Archivováno 15. dubna 2021 na Wayback Machine . února 1997
  2. Mihir Bellare, Ran Canetti a Hugo Krawczyk. Klíčování hash funkcí pro autentizaci zprávy. 1996. Stáhnout PDF Archivováno 9. května 2009 na Wayback Machine .
  3. implementace v Pythonu  (eng.)  (downlink) . - zdrojový kód. Archivováno z originálu 4. června 2012.
  4. Implementace PHP  (  nepřístupný odkaz) . - zdrojový kód. Archivováno z originálu 4. června 2012.

Odkazy

  • HMAC  (anglicky) .
  • RFC 2104 . HMAC. února 1997
  • RFC 4226 . M'Raihi D., Bellare M., Hoornaert F., Naccache D., Ranen O. " HOTP : algoritmus jednorázového hesla založený na HMAC". prosince 2005
  • Generování HMAC online . Online generátor HMAC.