„HMAC“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
klammern physisch formatiert, da TeX von sich aus keine wachsenden Klammern rendert, um zusammengehörende Klammernpaare deutlicher zu kennzeichnen
unbelegter kram entfernt, neue abschnitte zu entwurf und sicherheit
Zeile 2: Zeile 2:
HMACs werden in [[Request for Comments|RFC]] 2104<ref name="rfc2104" /> sowie im [[NIST]] Standard FIPS 198 spezifiziert und in RFC 4868<ref name="rfc4868" /> für den Einsatz in [[IPsec]] erweitert. Zudem können sie beispielsweise in den Protokollen [[Transport Layer Security|TLS]]<ref name="rfc5246" /> und [[Secure Shell|SSH]]<ref name="rfc4253" /> eingesetzt werden.
HMACs werden in [[Request for Comments|RFC]] 2104<ref name="rfc2104" /> sowie im [[NIST]] Standard FIPS 198 spezifiziert und in RFC 4868<ref name="rfc4868" /> für den Einsatz in [[IPsec]] erweitert. Zudem können sie beispielsweise in den Protokollen [[Transport Layer Security|TLS]]<ref name="rfc5246" /> und [[Secure Shell|SSH]]<ref name="rfc4253" /> eingesetzt werden.


== Konstruktion ==
Der HMAC wird aus der Nachricht <math>N</math> und einem [[Geheimer Schlüssel|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 auf die Blocklänge <math>B</math> der Hash-Funktion (512 Bit für die meisten gängigen Hash-Funktionen) aufgefüllt. 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.
Der HMAC wird aus der Nachricht <math>N</math> und einem [[Geheimer Schlüssel|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 auf die Blocklänge <math>B</math> der Hash-Funktion (512 Bit für die meisten gängigen Hash-Funktionen) aufgefüllt. 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.


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


Die Werte <math>opad</math> und <math>ipad</math> sind dabei Konstanten, <math>\oplus</math> steht für die bitweise XOR-Operation und <math>\;||\;</math> für die Verknüpfung durch einfaches Zusammensetzen (Konkatenation).
Die Werte <math>opad</math> und <math>ipad</math> sind dabei Konstanten, <math>\oplus</math> steht für die bitweise XOR-Operation und <math>\;||\;</math> für die Verknüpfung durch einfaches Zusammensetzen (Konkatenation).
Zeile 11: Zeile 12:
:<math>opad = \underbrace{\mathrm{0x5C}\dotso\mathrm{0x5C}}_{B\text{-mal}} \text{ und } ipad = \underbrace{\mathrm{0x36}\dotso\mathrm{0x36}}_{B\text{-mal}}</math>.
:<math>opad = \underbrace{\mathrm{0x5C}\dotso\mathrm{0x5C}}_{B\text{-mal}} \text{ und } ipad = \underbrace{\mathrm{0x36}\dotso\mathrm{0x36}}_{B\text{-mal}}</math>.


== Entwurfsprinzipien ==
Der innere Hashwert alleine ist nicht ausreichend, da ein Angreifer einfach weitere Blöcke an N anhängen und den Hashwert weiterrechnen könnte. Die innere Schlüsselkomponente sichert also nur den Anfang der Nachricht. Die Äußere Funktion sichert auch das „Ende“ der Nachricht.
[[Datei:MerkleDamgard.svg|thumb|350px|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 fast alle kryptographischen Hashfunktionen auf der [[Merkle-Damgård-Konstruktion]] beruhen, also auf der Iteration einer Kompressionsfunktion.
== Eigenschaften ==
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 X 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.<ref name="BCK96" />
Vorausgesetzt sei:
* Die Hashfunktion H ist [[unumkehrbar]] (Berechnung von N aus H(N) ausgeschlossen)
* H ist [[Kollisionsresistenz|kollisionsresistent]] (N,N' mit H(N)=H(N') nicht bestimmbar)


Wenn die zugrundeliegende Hashfunktion als [[Kollisionsresistenz|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" />
Unter diesen Voraussetzungen kann für den HMAC folgendes abgeleitet werden:
* Die Bestimmung des Schlüsselwerts K aus der Nachricht N und dem HMAC-Wert ist ausgeschlossen.
* Die Bestimmung der Nachricht N aus K und dem HMAC-Wert ist ausgeschlossen.
* Es können keine unterschiedlichen Wertepaare (K',N') gefunden werden, die zum gleichen HMAC-Wert führen.


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.
Die Eigenschaften können jedoch auch dann erfüllt sein, falls die Hash-Funktion H die geforderten Eigenschaften nicht voll erfüllt. Für einen festen Schlüsselwert kann die HMAC-Funktion als Hash-Funktion angesehen werden. Die Sicherheit dieser Hash-Funktion ist gewährleistet, sofern die Hash-Funktion H sicher ist.


== Sicherheit ==
Auch eine Hashfunktion, die nur eine [[Kryptologische Hashfunktion#Klassifizierung|Einweghashfunktion]] (OWHF) ist, wäre hinreichend für einen MAC. Zu einem gegebenen MAC-Wert, entsprechend einem Schlüssel und einer Nachricht, kann für eine OWHF keine zweite Nachricht oder ein zweiter Schlüssel mit gleichem MAC-Wert gefunden werden.

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.


== Literatur ==
== Literatur ==
Zeile 86: Zeile 85:
}}
}}
</ref>
</ref>
<ref name="BCK96">{{Literatur
| Autor=Mihir Bellare, Ran Canetti, and Hugo Krawczyk
| Titel=Keying hash functions for message authentication
| Sammelwerk=Advances in Cryptology – Crypto 96 Proceedings
| Band=LNCS 1109
| Verlag=Springer
| DOI=10.1007/3-540-68697-5_1
| Jahr=1996
| Seiten=1–15
| Online=[http://cseweb.ucsd.edu/~mihir/papers/hmac.html Link]
}}</ref>
<ref name="Bell06">{{Literatur
| Autor=Mihir Bellare
| Titel=New Proofs for NMAC and HMAC: Security without Collision-Resistance
| Sammelwerk=Advances in Cryptology – Crypto 2006 Proceedings
| Band=LNCS 4117
| Verlag=Springer
| DOI=10.1007/11818175_36
| Jahr=2006
| Seiten=602–619
| Online=[http://cseweb.ucsd.edu/~mihir/papers/hmac-new.html Link]
}}</ref>
<ref name="BGM04">{{Literatur
| Autor=Mihir Bellare, Oded Goldreich und Anton Mityagin
| Titel=The Power of Verification Queries in Message Authentication and Authenticated Encryption
| Jahr=2004
| Online=http://eprint.iacr.org/2004/309
}}</ref>
</references>
</references>



Version vom 29. April 2012, 15:39 Uhr

Ein Keyed-Hash Message Authentication Code (HMAC) ist eine Art Message Authentication Code (MAC), dessen Konstruktion auf einer kryptografischen Hash-Funktion basiert.[1] HMACs werden in RFC 2104[2] sowie im NIST Standard FIPS 198 spezifiziert und in RFC 4868[3] für den Einsatz in IPsec erweitert. Zudem können sie beispielsweise in den Protokollen TLS[4] und SSH[5] eingesetzt werden.

Konstruktion

Der HMAC wird aus der Nachricht und einem geheimen Schlüssel mittels der Hash-Funktion nach RFC 2104 wie folgt berechnet.[2] wird auf die Blocklänge der Hash-Funktion (512 Bit für die meisten gängigen Hash-Funktionen) aufgefüllt. Falls die Länge von größer als die Blocklänge der Hash-Funktion ist, wird durch ersetzt.

Die Werte und sind dabei Konstanten, steht für die bitweise XOR-Operation und für die Verknüpfung durch einfaches Zusammensetzen (Konkatenation).

Nach RFC 2104 sind beide Konstanten wie folgt definiert:[2]

.

Entwurfsprinzipien

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 fast alle 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 . Aufgrund der Struktur der Hashfunktion kann leicht zu einem beliebigen X und dem Hashwert einer unbekannten Nachricht M der Hashwert berechnet werden, wenn die Finalisierungsfunktion fehlt oder leicht umkehrbar ist. Damit kann aber auch zu erweitert werden.[6]

Wenn die zugrundeliegende Hashfunktion als kollisionsresistent angenommen wird, sind einfache MAC-Konstruktionen möglich, beispielsweise die Berechnung als . Die Konstruktion ist allerdings unsicher sobald eine Kollision gefunden ist, denn wenn , dann ist aufgrund der Struktur unabhängig vom Schlüssel K auch .[6]

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.[7] Da jede pseudozufällige Funktion auch ein guter MAC ist,[8] ist die HMAC-Konstruktion ebenfalls ein guter MAC.

Literatur

  • William Stallings: Cryptography and Network Security: Principles and Practice. 5. Auflage. (International Edition), Pearson Education, publishing as Prentice Hall, 2011, ISBN 978-0-13-705632-3.

Weblinks

Einzelnachweise

  1. Stallings: Cryptography and Network Security: Principles and Practice. S. 399–400.
  2. a b c H. Krawczyk, M. Bellare, R. Canetti: RFC 2104, HMAC: Keyed-Hashing for Message Authentication. IETF, abgerufen am 11. November 2011.
  3. S. Kelly, S. Frankel: RFC 4868, Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec. IETF, abgerufen am 11. November 2011.
  4. T. Dierks, E. Rescorla: RFC 5246, The Transport Layer Security (TLS) Protocol Version 1.2. IETF, S. 14, abgerufen am 11. November 2011: „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.“
  5. T. Ylonen, C. Lonvick, Ed.: RFC 4253, The Secure Shell (SSH) Transport Layer Protocol. IETF, S. 12, abgerufen am 11. November 2011: „The "hmac-*" algorithms are described in [RFC2104].“
  6. a b Mihir Bellare, Ran Canetti, and Hugo Krawczyk: Keying hash functions for message authentication. In: Advances in Cryptology – Crypto 96 Proceedings. LNCS 1109. Springer, 1996, S. 1–15, doi:10.1007/3-540-68697-5_1 (Link).
  7. Mihir Bellare: New Proofs for NMAC and HMAC: Security without Collision-Resistance. In: Advances in Cryptology – Crypto 2006 Proceedings. LNCS 4117. Springer, 2006, S. 602–619, doi:10.1007/11818175_36 (Link).
  8. Mihir Bellare, Oded Goldreich und Anton Mityagin: The Power of Verification Queries in Message Authentication and Authenticated Encryption. 2004 (iacr.org).