HMAC ( tulee joskus sanoista hash -pohjainen viestin todennuskoodi , viestin todennuskoodi hash - funktioita käyttävänä tai englanninkielisenä avaimenperäisenä hash-sanoman todennuskoodina , viestin todennuskoodi, jossa käytetään hash-funktioita avaimella) — tietojenkäsittelytieteessä ( kryptografia ), yksi mekanismit tietojen eheyden tarkistamiseksi sen varmistamiseksi, että asiattomat henkilöt eivät ole muuttaneet lähetettyä tai epäluotettavassa ympäristössä tallennettua tietoa (katso mies keskellä ). HMAC-moottori käyttää valelisäystä (MAC) , on kuvattu RFC 2104 :ssä, ANSI- , IETF- , ISO- ja NIST -standardeissa . MAC on standardi, joka kuvaa, kuinka tietoja vaihdetaan ja kuinka lähetetyn tiedon eheys tarkistetaan salaisella avaimella. Kaksi MAC:ta käyttävää asiakasta jakavat tavallisesti yhteisen salaisuuden. HMAC - lisäosa MAC:iin; mekanismi tietojen vaihtamiseksi salaisella avaimella (kuten MAC:ssa) ja hash-funktioilla . Nimi voi määrittää käytetyn hash-funktion [1] : HMAC- MD5 , HMAC- SHA1 , HMAC -RIPEMD128 , HMAC- RIPEMD160 jne .
huomattu[ kenen toimesta? ] , jotka hash-funktiot (esim . MD5 , SHA-1 , RIPEMD128 , RIPEMD-160 ) ovat yleensä nopeampia kuin symmetriset lohkosalaukset (esim . DES ). MACissa haluttiin käyttää hash-funktioita, ja valmiiden kirjastojen saatavuus erilaisilla hash-funktioilla toteutettuina vain työnsi tätä ajatusta.
Mutta joitain hash-funktioita ei ollut mahdollista käyttää MACissa. Esimerkiksi MD5 - hajautusfunktiota ei voi käyttää MACissa, koska se ottaa vain yhden argumentin - datan (merkkijono, tavusarja) eikä käytä salaista avainta.
Kesäkuussa 1996 [2] Hugo Krawczyk ( eng. Hugo Krawczyk , IBM :n työntekijä ), Mihir Bellar ( eng. Mihir Bellare , Kalifornian yliopiston työntekijä San Diegossa (UCSD) ) ja Ran Cannetti ( eng. Ran ) Canetti , IBM:n työntekijä ) julkaisi kuvauksen HMAC-mekanismista, ja helmikuussa 1997 he julkaisivat myös RFC 2104:n . HMAC:ssa tiedot "sekoitettiin" avaimeen ja hajautustoimintoa käytettiin kahdesti.
Muita mekanismeja on ehdotettu mahdollistamaan tietojen ja salaisen avaimen samanaikainen käyttö olemassa olevissa hajautusalgoritmeissa, mutta HMAC on saanut eniten tukea. .
HMAC:n edut:
HMAC - mekanismi on kuvattu ANSI - , IETF - , ISO - ja NIST - organisaatioiden standardeissa .
HMAC:n käyttöönotto on pakollista ( eng. mandatory to implement ) IPsec -protokollalle .
HMAC:ta käytetään myös muissa Internet -protokollissa , kuten TLS :ssä .
hash-toiminto H | b, tavu | L, tavu |
---|---|---|
MD5 | 64 | 16 |
SHA-1 | 64 | kaksikymmentä |
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-algoritmi voidaan kirjoittaa yhtenä kaavana [1] : missä:
HMAC-algoritmin kaavio on esitetty kuvissa.
HMAC-algoritmin vaiheet on lueteltu alla.
Tavua pienemmät avaimet Lkatsotaan [1] vaarallisiksi ( eng. voimakkaasti ei suositella ). On suositeltavaa [1] valita avaimet satunnaisesti ja vaihtaa niitä säännöllisesti. Tavua suuremmat avaimet Leivät lisää merkittävästi [1] funktion voimakkuutta, voidaan käyttää, jos on epäilyksiä avaimen luomiseen käytetyn ja satunnaislukugeneraattorilta saadun tiedon satunnaisuudesta.
Avaimen koon Кon oltava suurempi tai yhtä suuri kuin L/2tavut .
Kuvassa on HMAC-MD5-algoritmin tehokkaampi [ tarkenna ] toteutus. Toteutus eroaa F. Tämä toteutus on hyödyllinen, jos suurin osa viesteistä, joille MAC lasketaan, ovat lyhyitä. Funktio F– Hajautusfunktion pakkaustoiminto H. FSe ottaa muuttujan nja btavun pituisen lohkon argumentteina . Fjakaa lohkon linkkiketjuksi, jonka kunkin linkin pituus ntavuina. Toimintoa Fkutsutaan kerran jokaista uutta näppäintä varten.
Seuraavassa on esimerkki HMAC :n toteutuksesta pseudokoodissa :
FUNCTION hmac( key, msg ) : // Jos avaimen koko on suurempi kuin lohkon koko... IF pituus( avain ) > block_size THEN : // Lyhennä avainta hash-funktion tuloksen kokoon avain = hash(avain) // (Hash-tuloksen koko on yleensä pienempi (ei yhtä suuri kuin) hash-lohkon koko) END_IF // Jos avain on pienempi kuin hash-lohkon koko... IF pituus( avain ) < block_size THEN : // Avaimen täydentäminen nollasekvenssillä avain = avain ∥ nollat(lohkon_koko - pituus(avain )) // operaattori "∥" suorittaa merkkijonojen (tavujen sekvenssien) yhdistämisen END_IF ipad = [ '\x36' * block_size ] // operaattori "*" ilmaisee tavusarjan toistojen lukumäärän, // ja block_size - hash-funktiolohkon koon, opad = [ '\x5c' * block_size ] ikeypad = ipad ⊕ -näppäin // operaattori "⊕" suorittaa bittikohtaisesti poissulkevan TAI (xor) näppäimistö = opad ⊕ -näppäin RETURN hash( okeypad ∥ hash( ikeypad ∥ msg ) ) // Operaattori "∥" liittää merkkijonot END_FUNCTIONEsimerkki HMAC-MD5-algoritmin toteutuksesta Python -standardikirjaston funktioita käyttäen [3] :
tuonti hmac , hashlib print ( hmac . new ( key = b 'secret_shared_key' , msg = open ( 'message.txt' , 'rb' ) . read (), digestmod = hashlib . md5 ) . hexdigest ())Yksi HMAC-MD5-algoritmin mahdollisista toteutuksista PHP :ssä [4] :
function hmac ( $avain , $data ) { $b = 64 ; // lohkokoko RFC 2104:n mukaan if ( strlen ( $avain ) > $b ) { $avain = pakkaus ( "H*" , md5 ( $avain ) ); } $avain = str_pad ( $avain , $b , chr ( 0x00 ) ); $ipad = str_pad ( '' , $b , chr ( 0x36 ) ); $opad = str_pad ( '' , $b , chr ( 0x5c ) ); $k_ipad = $avain ^ $ipad ; $k_opad = $avain ^ $opad ; return md5 ( $k_opad . pack ( "H*" , md5 ( $k_ipad . $data ) ) ); }Esitetään esimerkki siitä, kuinka algoritmi toimii eri syöttötiedoilla.
Ensimmäinen parametri on K160 bitin (20 tavun) avain. Toinen parametri on viesti text, jonka lähettäjä lähettää ja jonka vastaanottaja todentaa. Lähdössä saamme 160-bittisen todennuskoodin.
HMAC( K, teksti ) = HMAC( 000000000000000000000000000000000000000, "" ) = 740ca4e7a701540b385df12fe57cff57 HMAC( K, teksti ) = HMAC( 000000000000000000000000000000000000000, "Hei maailma" ) = a0e026219366a56cf843bd2051831327 HMAC( K, teksti ) = HMAC( 00000000000000000000000000000000000001, "1" ) = c6b1d8489a204918643086ce346b86bcKatsotaanpa tarkemmin HMAC - SHA1 -algoritmia 20-tavuisella avaimella.
Meillä on: tekstiviesti text = "Hello World"ja 20-tavuinen avain heksadesimaalimuodossaK = 0x707172737475767778797a7b7c7d7e7f80818283
Vaihe 1. Täytä avain Knollalla tavulla lohkon koon mukaan. SHA-1- hajautusfunktion lohkokoko on 64 tavua.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
Tuloksena olevan todennuskoodin avulla voit varmistaa, että tietoja ei ole muutettu millään tavalla sen jälkeen, kun ne on luotu, siirretty tai tallennettu luotettavasta lähteestä. Tällaista todentamista varten on esimerkiksi välttämätöntä, että kaksi toisiinsa luottavaa osapuolta sopivat etukäteen vain heille kuuluvan salaisen avaimen käytöstä. Tämä takaa lähteen ja viestin aitouden. Tämän lähestymistavan haittapuoli on ilmeinen - täytyy olla kaksi osapuolta, jotka luottavat toisiinsa.
Minkä tahansa sisäänrakennettuun hajautusfunktioon perustuvan MAC-funktion turvallisuus riippuu taustalla olevan hash-funktion vahvuudesta. HMAC:n vetovoima on, että sen luojat pystyivät todistamaan tarkan suhteen sisäänrakennettujen hash-funktioiden vahvuuden ja HMAC:n vahvuuden välillä.
Jäljitelmälisäystoiminnon (MAC) turvallisuus ilmaistaan yleensä onnistuneen hyökkäyksen todennäköisyydellä siihen käytetyllä aikamäärällä sekä samalla avaimella luodun parin (viestin - MAC) vastaanottamisena. Pohjimmiltaan BELL96a :ssa on todistettu, että tietyllä vaivalla (aika, viesti - MAC) loppukäyttäjän luomaan viestiin onnistuneen hyökkäyksen todennäköisyys HMAC:iin vastaa hyökkäystä sisäänrakennettuun hash-funktio: