HMAC

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 31. elokuuta 2017 tarkistetusta versiosta . tarkastukset vaativat 38 muokkausta .

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 .

Historia

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 .

Sovellus

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ä .

Algoritmin kuvaus

Merkintä
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.

  1. Hanki pienentämällä tai suurentamalla avainta lohkon kokoon (enintään tavua).K0Kb
1.1. Jos avaimen pituus on Kyhtä suuri kuin lohkon koko, kopioi Ktiedostoon ilman muutoksia ja siirry vaiheeseen 2.K0 JOS pituus( K ) == b NIIN  : K_0 = K LOPPU JOS 1.2. Jos avaimen pituus on Ksuurempi kuin lohkon koko, käytämme Ktiivistefunktiota avaimeen H, hankimme Ltavukokoisen merkkijonon, lisäämme nollia tämän merkkijonon oikealle puolelle luodaksesi btavukokoisen merkkijonon, kopioimme tuloksen kohteeseen ja siirry vaiheeseen 2.K0 JOS pituus( K ) > b NIIN  : x = H( K ) // pituus( x ) == L K_0 = nollia( x, b - L ) LOPPU JOS 1.3. Jos avaimen pituus on Kpienempi kuin lohkon koko, lisää sitten nollia oikealle puolelle Kluodaksesi btavukokoisen merkkijonon, kopioi tulos (esimerkiksi jos (tavuina) ja (tavuina), sitten nollatavuina ( ) lisätään oikealle puolelle ) ja siirry vaiheeseen 2.K0length( К ) = 20b = 64К64 - 20 = 440x00 JOS pituus( K ) < b NIIN  : K_0 = nollia( K, b - pituus( K ) ) LOPPU JOS
  1. Hanki tavukokoinen lohko käyttämällä bittikohtaista XOR -toimintoa ("xor", " " ):Sib
S i = xor( K 0 , ipad ) = K 0 ipad.
  1. Hanki tavun kokoinen lohko käyttämällä bittikohtaista XOR -toimintoa :Sob
S o = xor( K 0 , opad ) = K 0 opad.
  1. Jaa viesti (data, tavujoukko) texttavukokoisiksi lohkoiksi b.
  2. Liimaa jokaiseen viestilohkoon merkkijono (tavusarja) .SiМ
  3. Käytä hash-funktiota edellisessä vaiheessa saatuun merkkijonoon Н.
  4. Yhdistä merkkijono edellisessä vaiheessa hajautusfunktiosta saatuun merkkijonoon .SoH
  5. Käytä hash-funktiota edellisessä vaiheessa saatuun merkkijonoon Н.

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.

Pseudokoodi

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_FUNCTION

Koodiesimerkkejä

Esimerkki 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 ) ) ); }

Esimerkkejä työstä

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

Katsotaanpa 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

Vaihe 2. Suoritamme bittikohtaisen XOR-operaation vakiolla 0x36.

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

Vaihe 3. Liimaa alkuperäinen viesti vaiheessa 2 vastaanotetulla merkkijonolla.

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

Vaihe 4. Käytä SHA-1- tiivistefunktiota edellisessä vaiheessa saatuun merkkijonoon.

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

Vaihe 5. Suorita bittikohtainen XOR-toiminto vakiolla 0x5c.

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

Vaihe 6. Vaiheessa 4 saadun merkkijonon yhdistäminen vaiheessa 5 saatuun merkkijonoon.

( 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

Vaihe 7. Käytä SHA-1- tiivistefunktiota edellisessä vaiheessa saatuun merkkijonoon.

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

Tulokset. Saimme HMAC( K, text )20 tavun merkkijonon.

Käyttöongelmat

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.

Turvallisuus

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:

  1. Ensimmäisessä hyökkäyksessä voimme pitää pakkausfunktioita F vastaavina hajautusfunktion kanssa, jota sovelletaan viestiin, joka koostuu yhdestä B-bitin pituisesta lohkosta. Tätä varten hash-funktion syöte on N bitin pituinen satunnaisarvo. Hyökkäys hash-funktiota vastaan ​​vaatii joko tyhjentävän haun avaimesta, jonka järjestyksen monimutkaisuustaso on , tai "syntymäpäivä"-hyökkäyksen , joka on toisen hyökkäyksen erikoistapaus, kuten alla käsitellään.
  2. Toisessa hyökkäyksessä hyökkääjä etsii kahta viestiä Мja М', jotka saadaan samasta hash-funktiosta: H( M ) = H( M' ). Tämäntyyppinen hyökkäys tunnetaan myös syntymäpäivähyökkäyksenä . Tämän hyökkäyksen vaikeustaso on pituiselle hajautusarvolle . Tämän perusteella MD5 hash -funktion turvallisuus kyseenalaistetaan, koska sen monimutkaisuustaso , joka ei enää näytä mahdottomalta nykyaikaisellan[ milloin? ] teknologioita. Tarkoittaako tämä, että 128-bittinen hash-funktio, kuten MD5, ei sovellu HMAC:lle? Vastaus tähän kysymykseen on ei, mikä seuraa seuraavista väitteistä . Hyökkääessään MD5:tä vastaan ​​hyökkääjä voi valita minkä tahansa viestijoukon ja etsiä törmäyksiä offline-tilassa. Koska hyökkääjä tietää hajautusalgoritmin ja alkuehdot, hyökkääjä voi luoda hajakoodin jokaiselle viestille. HMAC:n kimppuun hyökkääessään hyökkääjä ei kuitenkaan voi luoda paria ("viesti", "koodi") etätilassa (offline-tilassa), koska hyökkääjä ei tunne avainta K. Siten hyökkääjän on seurattava HMAC:n samalla avaimella luomaa viestisarjaa ja suoritettava hyökkäys niitä vastaan. 128-bittinen hash-koodi vaatii samalla avaimella luotuja lohkoja tai bittejä. 1 Gbitin yhteydellä pitäisi seurata viestivirtaa, jos avain ei muutu, 150 000 vuotta onnistuakseen. Siten, jos nopeus on olennainen asia, on täysin hyväksyttävää käyttää MD5:tä SHA-1:n sijaan sisäänrakennettuna HMAC:n hajautusfunktiona.K

Katso myös

Lähteet

  • Black W. Internet-suojausprotokollat. Moskova: kustantamo "Peter". 2001. ISBN 5-318-00002-9 (alkuperäinen englanninkielinen ISBN: ISBN 0-13-014249-2 ).
  • RFC 2104 . Krawczyk H., Bellare M., Canetti R. "HMAC: Keyed-hashing for message authentication". Helmikuu 1997
  • Stallings W. Kryptografian ja verkkoturvallisuuden periaatteet ja käytännöt. 2005. ISBN 0-13-187316-4 .

Muistiinpanot

  1. 1 2 3 4 5 6 7 Krawczyk H., Bellare M., Canetti R. "HMAC: Keyed-hashing for message authentication". RFC 2104 arkistoitu 15. huhtikuuta 2021 Wayback Machinessa . Helmikuu 1997
  2. Mihir Bellare, Ran Canetti ja Hugo Krawczyk. Hajautustoimintojen näppäily viestien todennusta varten. 1996. Lataa PDF Arkistoitu 9. toukokuuta 2009 Wayback Machinessa .
  3. toteutus Pythonissa  (eng.)  (downlink) . - lähdekoodi. Arkistoitu alkuperäisestä 4. kesäkuuta 2012.
  4. PHP-toteutus  (  linkki ei saavutettavissa) . - lähdekoodi. Arkistoitu alkuperäisestä 4. kesäkuuta 2012.

Linkit

  • HMAC  (englanniksi) .
  • RFC 2104 . HMAC. Helmikuu 1997
  • RFC 4226 . M'Raihi D., Bellare M., Hoornaert F., Naccache D., Ranen O. " HOTP : HMAC-pohjainen kertakäyttöinen salasanaalgoritmi". joulukuuta 2005
  • Luo HMAC Online . Online HMAC-generaattori.