HMAC ( ibland står för hash-baserad meddelandeautentiseringskod , meddelandeautentiseringskod med hashfunktioner , eller som engelsk keyed-hash meddelandeautentiseringskod , meddelandeautentiseringskod som använder hashfunktioner med en nyckel) — inom datavetenskap ( kryptering ) , en av de mekanismer för att kontrollera informationens integritet för att säkerställa att data som överförs eller lagras i en opålitlig miljö inte har ändrats av obehöriga personer (se mannen i mitten ). HMAC-mekanismen använder impersonation insertion (MAC) , som beskrivs i RFC 2104 , i standarderna för organisationer ANSI , IETF , ISO och NIST . MAC är en standard som beskriver hur man utbyter data och hur man kontrollerar integriteten hos överförda data med hjälp av en hemlig nyckel. Två klienter som använder en MAC delar vanligtvis en delad hemlighet. HMAC - tillägg över MAC; mekanism för att utbyta data med hjälp av en hemlig nyckel (som i MAC) och hash-funktioner . Namnet kan specificera hashfunktionen som används [1] : HMAC- MD5 , HMAC- SHA1 , HMAC -RIPEMD128 , HMAC - RIPEMD160 , etc.
uppmärksammats[ av vem? ] att hashfunktioner (t.ex. MD5 , SHA-1 , RIPEMD128 , RIPEMD-160 ) vanligtvis är snabbare än symmetriska blockchiffer (t.ex. DES ). Det fanns en önskan om att använda hashfunktioner i MAC, och tillgången på färdiga bibliotek med implementeringar av olika hashfunktioner drev bara på denna idé.
Men det gick inte att använda vissa hash-funktioner i MAC. Till exempel kan MD5- hashfunktionen inte användas i en MAC, eftersom den bara tar ett argument - data (sträng, sekvens av byte) och inte använder en hemlig nyckel.
I juni 1996 [2] Hugo Krawczyk ( eng. Hugo Krawczyk , anställd på IBM ), Mihir Bellar ( eng. Mihir Bellare , anställd vid University of California i San Diego (UCSD) ) och Ran Cannetti ( eng. Ran Canetti , en IBM- anställd ) publicerade en beskrivning av HMAC-mekanismen, och i februari 1997 släppte de också RFC 2104 . I HMAC "blandades" data med nyckeln och hashfunktionen användes två gånger.
Andra mekanismer har föreslagits för att tillåta samtidig användning av data och en hemlig nyckel i befintliga hashalgoritmer, men HMAC har fått mest stöd. .
Fördelar med HMAC:
HMAC-mekanismen har beskrivits i ANSI- , IETF- , ISO- och NIST- organisationernas standarder .
Implementeringen av HMAC är obligatorisk ( eng. obligatorisk att implementera ) för protokollet IPsec .
HMAC används också i andra Internetprotokoll , såsom TLS .
hash-funktion H | b, byte | L, byte |
---|---|---|
MD5 | 64 | 16 |
SHA-1 | 64 | tjugo |
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 ) |
HMAC-algoritmen kan skrivas som en enkel formel [1] : där:
Schemat för HMAC-algoritmen visas i figurerna.
Stegen för HMAC-algoritmen listas nedan.
Nycklar som är mindre än Lbyte anses vara [1] osäkra ( eng. starkt avrådd ). Det rekommenderas [1] att välja nycklar slumpmässigt och ändra dem regelbundet. Nycklar som är större än Lbyte, ökar inte [1] funktionens styrka avsevärt, kan användas om det finns tvivel om slumpmässigheten hos de data som används för att skapa nyckeln och som tas emot från slumptalsgeneratorn.
Nyckelstorleken Кmåste vara större än eller lika med L/2byte .
Figuren visar en mer effektiv [ förfina ] implementering av HMAC-MD5-algoritmen. Implementeringen skiljer sig åt i användningen av F. Denna implementering är användbar om de flesta meddelanden som MAC beräknas för är korta. Funktion F− Kompressionsfunktionen för hashfunktionen H. FDet tar en variabel noch ett bbyte -längdblock som argument . Fdelar upp blocket i en kedja av länkar med längden på varje länk i nbyte. Funktionen Fanropas en gång för varje ny knapp.
Följande är ett exempel på implementering av HMAC i pseudokod :
FUNCTION hmac( key, msg ) : // Om nyckelstorleken är större än blockstorleken ... IF length( key ) > block_size DÅ : // Förkorta nyckeln till storleken på hashfunktionsresultatet nyckel = hash(nyckel) // (Storleken på hashresultatet är vanligtvis mindre än (inte lika med) hashblockstorleken) END_IF // Om nyckeln är mindre än hashblockstorleken ... IF length( key ) < block_size THEN : // Att komplettera nyckeln med en nollsekvens nyckel = nyckel ∥ nollor( block_size - length( key )) // operatorn "∥" utför sammanslagna strängar (sekvenser av byte) END_IF ipad = [ '\x36' * block_size ] // operatorn "*" indikerar antalet repetitioner av en sekvens av byte, // och block_size - storleken på hashfunktionsblocket, opad = [ '\x5c' * block_size ] ikeypad = ipad ⊕-tangent // operatorn "⊕" utför bitvis exklusiv OR (xor) knappsats = opad ⊕ tangent RETURN hash( okeypad ∥ hash( ikeypad ∥ msg ) ) // Operatör "∥" skarvar strängar END_FUNCTIONEtt exempel på implementeringen av HMAC-MD5-algoritmen med funktionerna i Python -standardbiblioteket [3] :
import hmac , hashlib print ( hmac . new ( key = b 'secret_shared_key' , msg = open ( 'message.txt' , 'rb' ) . read (), digestmod = hashlib . md5 ) . hexdigest ())En av de möjliga implementeringarna av HMAC-MD5-algoritmen i PHP [4] :
funktion hmac ( $key , $data ) { $b = 64 ; // blockstorlek enligt RFC 2104 if ( strlen ( $key ) > $ b ) { $key = pack ( "H*" , md5 ( $key ) ); } $key = str_pad ( $key , $b , chr ( 0x00 ) ); $ipad = str_pad ( '' , $b , chr ( 0x36 ) ); $opad = str_pad ( '' , $b , chr ( 0x5c ) ); $k_ipad = $nyckel ^ $ipad ; $k_opad = $nyckel ^ $opad ; returnera md5 ( $k_opad . pack ( "H*" , md5 ( $k_ipad . $data ) ) ); }Låt oss visa ett exempel på hur algoritmen fungerar för olika indata.
Den första parametern är en nyckel Kpå 160 bitar (20 byte). Den andra parametern är meddelandet textsom kommer att skickas av avsändaren och autentiseras av mottagaren. Vid utgången får vi en autentiseringskod på 160 bitar.
HMAC( K, text ) = HMAC( 00000000000000000000000000000000000000000, "" ) = 740ca4e7a701540b385df12fe57cff57 HMAC( K, text ) = HMAC( 00000000000000000000000000000000000000000, "Hej världen" ) = a0e026219366a56cf843bd2051831327 HMAC( K, text ) = HMAC( 00000000000000000000000000000000000000001, "1" ) = c6b1d8489a204918643086ce346b86bcLåt oss ta en närmare titt på HMAC -SHA1- algoritmen med en 20-byte nyckel.
Vi har: ett textmeddelande text = "Hello World"och en 20-byte nyckel i hexadecimal formK = 0x707172737475767778797a7b7c7d7e7f80818283
Steg 1. Fyll nyckeln Kmed noll byte till storleken på blocket. Blockstorleken för en SHA-1- hashfunktion är 64 byte.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
Den resulterande autentiseringskoden låter dig verifiera att data inte har ändrats på något sätt sedan de skapades, överfördes eller lagrades av en pålitlig källa. För denna typ av verifiering är det till exempel nödvändigt att två parter som litar på varandra i förväg kommer överens om användningen av en hemlig nyckel som bara är känd för dem. Detta garanterar äktheten av källan och meddelandet. Nackdelen med detta tillvägagångssätt är uppenbart – det måste finnas två parter som litar på varandra.
Säkerheten för alla MAC-funktioner baserade på inbyggda hashfunktioner beror på styrkan hos den underliggande hashfunktionen. Attraktionen med HMAC är att dess skapare kunde bevisa det exakta förhållandet mellan styrkan hos inbyggda hashfunktioner och styrkan hos HMAC.
Säkerheten för imitera insättningsfunktionen (MAC) uttrycks vanligtvis i termer av sannolikheten för en framgångsrik attack med mängden tid som spenderas på den, samt att ta emot ett par (meddelande - MAC) skapat med samma nyckel. I huvudsak är det bevisat i BELL96a att för en given ansträngningsnivå (tid, meddelande - MAC) på ett meddelande som genereras av en slutanvändare, är sannolikheten för en framgångsrik attack på en HMAC likvärdig med en attack på en inbyggd hashfunktion: