Zum Inhalt springen

HMAC

aus Wikipedia, der freien Enzyklopädie

Ein HMAC (hash-based message authentication code (Hash-basierter Nachrichtenauthentifizierungscode), manchmal erweitert als keyed-hash message authentication code (Schlüssel-Hash-Nachrichtenauthentifizierungscode)) ist ein Message Authentication Code (MAC), dessen Konstruktion auf einer kryptografischen Hash-Funktion, wie beispielsweise dem Secure Hash Algorithm (SHA), und einem geheimen Schlüssel basiert.<ref>Stallings: Cryptography and Network Security. Principles and Practice. S. 399–400.</ref> HMACs werden in RFC 2104<ref name="RFC2104" /> sowie im NIST Standard FIPS 198 spezifiziert und in RFC 4868<ref>Vorlage:RFC-Internet</ref> für den Einsatz in IPsec erweitert. Zudem können sie beispielsweise in den Protokollen TLS<ref name="RFC5246" /> und SSH<ref name="RFC4253" /> eingesetzt werden.

Konstruktion

Der HMAC wird aus der Nachricht <math>M</math> und einem geheimen Schlüssel <math>K</math> mittels der Hash-Funktion <math>\mathrm{H}</math> nach RFC 2104 wie folgt berechnet.<ref name="RFC2104" /> <math>K</math> wird durch Anhängen von Null-Bytes (padding) auf die Blocklänge <math>B</math> der Hash-Funktion aufgefüllt;<ref name="RFC2104" /><ref name="padding">Im Sample Code im Appendix des RFC 2104 wird für das inner pad „0x36“ und für das outer pad „0x5c“ verwandt</ref> das sind 64 Byte (512 Bit) für viele Hash-Funktionen, z. B. für SHA-256. Für SHA3-256 oder SHAKE256 ist <math>B=136</math> (1088 Bit). Falls die Länge von <math>K</math> größer als die Blocklänge der Hash-Funktion ist, wird <math>K</math> durch <math>\mathrm{H}(K)</math> ersetzt.<ref name="RFC2104" />

<math>\mathrm{HMAC}_K(M) = \mathrm{H}\Big( (K \oplus opad ) \;||\; \mathrm{H}\big( (K \oplus ipad ) \;||\; M\big)\Big)</math>

Die Werte <math>opad</math> (outer pad, ein String) und <math>ipad</math> (inner pad, ein weiterer String) sind dabei Konstanten,<ref name="padding" /> <math>\oplus</math> steht für die bitweise XOR-Operation und <math>\;||\;</math> für die Verknüpfung durch einfaches Zusammensetzen (Konkatenation).

Nach RFC 2104 sind beide Konstanten outer pad und inner pad wie folgt definiert:<ref name="RFC2104" />

<math>opad = \underbrace{\mathrm{0x5C}\dotso\mathrm{0x5C}}_{\text{B-mal}} \text{ und } ipad = \underbrace{\mathrm{0x36}\dotso\mathrm{0x36}}_{\text{B-mal}}</math>.

Entwurfsprinzipien

Datei:MerkleDamgard.svg
Merkle-Damgård-Konstruktion: Aus den Nachrichtenblöcken wird durch wiederholte Anwendung der Kompressionsfunktion der Hashwert erzeugt.

Die auf den ersten Blick umständlich anmutende Konstruktion resultiert aus der Tatsache, dass die meisten älteren kryptographischen Hashfunktionen auf der Merkle-Damgård-Konstruktion beruhen, also auf der Iteration einer Kompressionsfunktion. So gibt es beispielsweise einen einfachen Angriff auf eine Konstruktion eines MACs als <math>H(K \| M)</math>. Aufgrund der Struktur der Hashfunktion kann leicht zu einem beliebigen <math>X</math> und dem Hashwert <math>H(M)</math> einer unbekannten Nachricht M der Hashwert <math>H(M \| X)</math> berechnet werden, wenn die Finalisierungsfunktion fehlt oder leicht umkehrbar ist. Damit kann aber auch <math>H(K \| M)</math> zu <math>H(K \| M \| X)</math> erweitert werden („length-extension“-Angriff).<ref name="BCK96" />

Wenn die zugrundeliegende Hashfunktion als kollisionsresistent angenommen wird, sind einfache MAC-Konstruktionen möglich, beispielsweise die Berechnung als <math>H(M \| K)</math>. Die Konstruktion ist allerdings unsicher, sobald eine Kollision gefunden ist, denn wenn <math>H(M_1) = H(M_2)</math>, dann ist aufgrund der Struktur unabhängig vom Schlüssel K auch <math>H(M_1 \| K) = H(M_2 \| K)</math>.<ref name="BCK96" />

Die Idee der HMAC-Konstruktion ist, bei der Sicherheit nicht auf die Kollisionsresistenz der Hashfunktion, sondern auf schwächere Annahmen zu vertrauen. Aus diesem Grund ist ein auf MD5 basierender HMAC immer noch sicher, obwohl für MD5 bereits Kollisionen gefunden wurden.

Sicherheit

Falls die zugrundeliegende Kompressionsfunktion eine pseudozufällige Funktion ist, so ist auch die HMAC-Konstruktion eine pseudozufällige Funktion.<ref name="Bell06" /> Da jede pseudozufällige Funktion auch ein guter MAC ist,<ref name="BGM04" /> ist die HMAC-Konstruktion ebenfalls ein guter MAC. Der einfachste Angriff auf einen HMAC ist es, den zugrunde liegenden geheimen Schlüssel <math>K</math> beispielsweise mittels Brute-Force zu erraten.

RFC 6151 wurde 2011 veröffentlicht, um die Sicherheit von MD5 und HMAC-MD5 zu bewerten. Für letzteres fasst es zusammen, dass – obwohl MD5 als kompromittiert anzusehen ist – die aktuell bekannten Angriffe gegen HMAC-MD5 keine „praktische Sicherheitslücke“ darstellen, wenn dieses als „Message Authentication Code benutzt wird“. Dennoch fügt es hinzu, dass für neue Protokolldesigns „HMAC-MD5 nicht mehr benutzt werden sollte“.<ref name="RFC6151" />

Literatur

  • {{#invoke:Vorlage:Literatur|f}}

Weblinks

Einzelnachweise

<references> <ref name="RFC2104"> Vorlage:RFC-Internet </ref> <ref name="RFC5246"> Vorlage:RFC-Internet {{

 #if: 
 | {{
     #ifeq: {{#if:en|en|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:en|en|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2=en
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: The TLS record layer uses a keyed Message Authentication Code (MAC) to protect message integrity. The cipher suites defined in this document use a construction known as HMAC, described in [HMAC], which is based on a hash function. Other cipher suites MAY define their own MAC constructions, if needed.

   | {{#if: 
       | {{#if: The TLS record layer uses a keyed Message Authentication Code (MAC) to protect message integrity. The cipher suites defined in this document use a construction known as HMAC, described in [HMAC], which is based on a hash function. Other cipher suites MAY define their own MAC constructions, if needed.
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}} </ref> <ref name="RFC4253"> Vorlage:RFC-Internet {{

 #if: 
 | {{
     #ifeq: {{#if:en|en|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:en|en|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2=en
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: The “hmac-*” algorithms are described in [RFC2104].

   | {{#if: 
       | {{#if: The “hmac-*” algorithms are described in [RFC2104].
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}} </ref> <ref name="BCK96"> {{#invoke:Vorlage:Literatur|f}} </ref> <ref name="Bell06"> {{#invoke:Vorlage:Literatur|f}} </ref> <ref name="BGM04"> {{#invoke:Vorlage:Literatur|f}} </ref> <ref name="RFC6151"> Vorlage:RFC-Internet </ref> </references>