HMAC
In der Kryptographie ist ein HMAC (manchmal erweitert als Schlüssel-Hash- Nachrichtenauthentifizierungscode oder Hash- basierter Nachrichtenauthentifizierungscode ) ein spezifisches Konstrukt zum Berechnen eines Nachrichtenauthentifizierungscodes (MAC), das eine kryptographische Hash-Funktion in Kombination mit einem geheimen kryptographischen Schlüssel beinhaltet. Wie jeder MAC kann es zur gleichzeitigen Überprüfung der Datenintegrität und Nachrichtenauthentifizierung verwendet werden . Jede kryptografische Hash-Funktion wie SHA-2 oder SHA-3 kann verwendet werden, um einen HMAC zu berechnen; der resultierende MAC-Algorithmus wird entsprechend HMAC-SHA2 oder HMAC-SHA3 genannt. Die kryptografische Stärke des HMAC hängt von der kryptografischen Stärke der zugrunde liegenden Hash-Funktion, der Größe ihrer Hash-Ausgabe und der Größe und Qualität des Schlüssels ab.
Eine iterative Hash-Funktion zerlegt eine Nachricht in Blöcke fester Größe und iteriert mit einer Komprimierungsfunktion über sie. Beispielsweise arbeiten SHA-2 und SHA-3 in 512-Bit-Blöcken. Die Größe der HMAC-Ausgabe entspricht der Größe der zugrunde liegenden Hash-Funktion (zwischen 224 und 512 Bit bei konfigurationsabhängigem SHA3).
Die Definition und Analyse des HMAC-Konstrukts wurde erstmals 1996 von Mihir Bellare , Ran Canetti und Hugo Krawczyk [ 1 ] veröffentlicht , die auch RFC 2104 geschrieben haben . Außerdem definiert dieses Dokument eine Variante namens NMAC, die selten, wenn überhaupt, verwendet wird. FIPS PUB 198 verallgemeinert und standardisiert die Verwendung von HMAC. HMAC-SHA1 und HMAC-MD5 werden innerhalb der IPsec- und TLS-Protokolle verwendet , sind aber heute nicht sicher.
Definition (aus RFC 2104 )
wo:
- H ist eine kryptografische Hash-Funktion,
- K ist ein geheimer Schlüssel, der rechts mit zusätzlichen Nullen auf die Größe des Eingangsblocks der Hash-Funktion aufgefüllt ist, oder der Hash des ursprünglichen Schlüssels, wenn er länger als die Blockgröße ist,
- m ist die zu authentifizierende Nachricht,
- || bedeutet Verkettung ,
- ⊕ bezeichnet exklusive Disjunktion (XOR),
- opad ist die äußere Polsterung (0x5c5c5c…5c5c, ein Block mit konstanter Hex -Länge),
- ipad ist die innere Auffüllung (0x363636…3636, ein Block mit konstanter Hex -Länge).
Umsetzung
Der folgende Pseudocode zeigt, wie HMAC implementiert werden kann. Die Blockgröße beträgt 64 (Bytes) bei Verwendung einer der folgenden Hash-Funktionen: SHA-1, MD5, RIPEMD-128/160. [ 2 ]
function hmac (key, message)
if (length(key) > blocksize) then
key = hash(key) // Schlüssel, die größer als der Block sind, werden gekürzt
end if
( length(key) < blocksize) then
key = key ∥ [0x00 * (blocksize - length(key))] // Schlüssel, die kürzer als die Blockgröße sind, werden mit Nullen vergrößert (wobei ∥ eine Verkettung ist)
end if
o_key_pad = [0x5c * Blockgröße] ⊕ Taste // Wenn die Blockgröße die der zugrunde liegenden Hash-Funktion ist
i_key_pad = [0x36 * Blockgröße] ⊕ Taste // Wobei ⊕ das exklusive Oder (XOR) ist
return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // Wobei ∥ die
Endfunktion der Verkettung ist
Das Folgende ist eine Python -Implementierung von HMAC-MD5:
#!/usr/bin/env python
aus hashlib import md5
trans_5C = bytearray (( x ^ 0x5c ) für x im Bereich ( 256 ))
trans_36 = bytearray (( x ^ 0x36 ) für x im Bereich ( 256 ))
blocksize = md5 () . Blockgröße #64
def hmac_md5 ( key , msg ):
if len ( key ) > blocksize :
key = md5 ( key ) . Digest ()
key = key + bytearray ( blocksize - len ( key ))
o_key_pad = key . übersetze ( trans_5C )
i_key_pad = key . translate ( trans_36 )
return md5 ( o_key_pad + md5 ( i_key_pad + msg ) .digest ( ))
if __name__ == "__main__" :
# Dies ist ein Beispiel aus dem RFC 2104- Addendum
h = hmac_md5 ( b "Head" , b "what do ya want for nothing?" )
print ( h .hexdigest ()) # 750c783e6ab0b503eaa86e310a5db738
Python enthält ein hmac-Modul, [ 3 ] , sodass die obige Funktion durch eine kürzere Version ersetzt werden kann.
import hmac
aus hashlib import md5
def hmac_md5 ( key , msg ):
hmac zurückgeben . HMAC ( key , msg , md5 )
Der folgende Code ist eine PHP -Implementierung von HMAC-SHA1:
Funktion sha1_hmac ( $key , $data , $blockSize = 64 , $opad = 0x5c , $ipad = 0x36 ) {
// Schlüssel größer als die Blockgröße werden gekürzt
if ( strlen ( $key ) > $blockSize ) {
$key = sha1 ( $key , true );
}
// Schlüssel, die kürzer als die Blockgröße sind, werden rechts mit Nullen aufgefüllt (verkettet)
$key = str_pad ( $key , $blockSize , chr ( 0x00 ), STR_PAD_RIGHT );
$o_key_pad = $i_key_pad = '' ;
for ( $i = 0 ; $i < $blockSize ; $i ++ ) {
$o_key_pad .= chr ( ord ( substr ( $key , $i , 1 )) ^ $opad );
$i_key_pad .= chr ( ord ( substr ( $key , $i , 1 )) ^ $ipad );
}
return sha1 ( $o_key_pad . sha1 ( $i_key_pad . $data , true ), true );
}
$hmac = sha1_hmac ( 'key' , 'Der schnelle braune Fuchs springt über den faulen Hund' );
PHP enthält eine HMAC-Funktion, [ 4 ] , sodass das obige Beispiel durch eine kürzere Version ersetzt werden kann.
<?php
hash_hmac ( 'sha1' , 'Der schnelle braune Fuchs springt über den faulen Hund' , 'Schlüssel' );
Das Folgende ist eine Implementierung mit Qt's QCryptographicHash
QByteArray hmacSha256 ( QByteArray key , const QByteArray & message ) {
const int blocksize = 64 ;
if ( Schlüssel . Länge () > Blockgröße )
QCryptographicHash :: Hash ( Schlüssel , QCryptographicHash :: Sha256 );
while ( Schlüssel . Länge () < Blockgröße )
Schlüssel . anhängen ( '\0' );
QByteArray o_key_pad ( '\x5c' , Blockgröße );
o_key_pad . füllen ( '\x5c' , Blockgröße );
QByteArray i_key_pad ;
i_key_pad . füllen ( '\x36' , Blockgröße );
for ( int i = 0 ; i < Blockgröße ; i ++ ) {
o_key_pad [ i ] = o_key_pad [ i ] ^ Taste [ i ];
i_key_pad [ i ] = i_key_pad [ i ] ^ Taste [ i ];
}
QCryptographicHash :: Hash ( o_key_pad + QCryptographicHash :: Hash ( i_key_pad + message , QCryptographicHash :: Sha256 ), QCryptographicHash :: Sha256 ) zurückgeben ;
}
Das Folgende ist ein Beispiel für die Verwendung von Node.js , das in das Kryptomodul mit HMAC-SHA1 integriert ist:
var crypto = require ( 'crypto' ),
hmac = crypto . createHmac ( 'sha1' , 'Shared Secret' );
hmac . aktualisieren ( Nachricht );
var hmacHash = hmac . verdauen ( 'hex' );
Gestaltungsprinzipien
Das Design der HMAC-Spezifikation wurde durch die Existenz von Angriffen gegen die trivialeren Mechanismen der Kombination eines Schlüssels mit einer Hash-Funktion motiviert. Beispielsweise könnte man annehmen, dass die gleiche Sicherheit, die HMAC bietet, mit MAC = H ( Schlüssel ∥ Nachricht ) erreicht werden könnte. Allerdings leidet diese Methode unter einem schwerwiegenden Fehler: Bei den meisten Hash-Funktionen ist es einfach, ohne Kenntnis des Schlüssels Daten zur Nachricht hinzuzufügen und einen anderen gültigen MAC zu erhalten ("Extension Length Attack"). Die Alternative, den Schlüssel mit MAC = H ( Nachricht ∥ Schlüssel ) hinzuzufügen, leidet unter dem Problem, dass ein Angreifer, der eine Hash-Funktionskollision finden kann, eine MAC-Kollision hat (da zwei Nachrichten M1 und M2, die denselben Hash erhalten, denselben Start ergeben Bedingung der Hash-Funktion, bevor der Hash des einschließenden Schlüssels abgerufen wird, sodass der endgültige Hash derselbe ist). Die Verwendung von MAC = H ( Schlüssel ∥ Nachricht ∥ Schlüssel ) ist besser, aber mehrere Sicherheitsartikel haben Schwachstellen bei diesem Ansatz vorgeschlagen, selbst wenn zwei verschiedene Schlüssel verwendet werden. [ 1 ]
Es sind keine Angriffserweiterungen gegen die aktuelle HMAC-Spezifikation bekannt, die als H ( key ∥ H ( key ∥ message )) definiert ist, da die externe Implementierung der Hash-Funktion das Zwischenergebnis des internen Hashs markiert. Die Werte von ipad und opad sind nicht kritisch für die Sicherheit des Algorithmus, aber er ist so definiert, dass wir eine große Hamming-Distanz voneinander haben und damit der innere und der äußere Schlüssel weniger Bits gemeinsam haben. Die Reduzierung der HMAC-Sicherheit zwingt sie nicht, sich auch nur ein bisschen zu unterscheiden. [ Zitat erforderlich ]
Die Keccak-Hash-Funktion, die von NIST als Gewinner des SHA-3-Wettbewerbs ausgewählt wurde, erfordert diesen verschachtelten Ansatz nicht und kann verwendet werden, um einen MAC zu generieren, indem einfach der Nachrichtenschlüssel vorangestellt wird. [ 5 ]
Sicherheit
Die kryptografische Stärke des HMAC hängt von der Größe des verwendeten geheimen Schlüssels ab. Der häufigste Angriff gegen HMAC ist Brute Force, um den geheimen Schlüssel zu entdecken. HMAC ist viel weniger von Kollisionen betroffen als die zugrunde liegenden Hash-Algorithmen allein. [ 6 ] [ 7 ] [ 8 ] Daher leidet HMAC-MD5 nicht unter den gleichen Schwächen, die in MD5 gefunden wurden.
Im Jahr 2006 zeigten Jongsung Kim, Alex Biryukov, Bart Preneel und Seokhie Hong, wie man HMAC mit verkürzten Versionen von MD5 und SHA-1 oder die Vollversionen von HAVAL, MD4 und SHA-0 von einer Zufallsfunktion oder HMAC mit a unterscheidet Zufallsfunktion. Verschiedene Unterscheidungen ermöglichen es einem Angreifer, einen HMAC-Spoofing-Angriff zu entwickeln. Darüber hinaus können unterschiedliche und rechteckige Unterscheidungsmerkmale zu Second-Preimage-Angriffen führen. HMAC mit der Vollversion von MD4 hat dieses Wissen verfälscht. Diese Angriffe widersprechen nicht dem HMAC-Sicherheitstest, sondern liefern Informationen über HMAC auf Basis vorhandener kryptografischer Hash-Funktionen. [ 9 ]
Im Jahr 2009 startete Xiaoyun Wang einen Identifizierungsangriff auf HMAC-MD5, ohne zugehörige Schlüssel zu verwenden. Eine Instanz von HMAC mit MD5 kann von einer Instanz mit einer Zufallsfunktion mit 2^97 Abfragen mit einer Wahrscheinlichkeit von 0,87 unterschieden werden. [ 10 ]
Im Jahr 2011 wurde ein informativer RFC 6151 [ 11 ] genehmigt, um die Sicherheitsüberlegungen in MD5 und HMAC-MD5 zu aktualisieren. Für HMAC-MD5 fasst der RFC zusammen, dass - obwohl die Sicherheit der MD5 - Hash -Funktion ernsthaft gefährdet ist - die derzeit bekannten "Angriffe auf HMAC-MD5 keine praktische Schwachstelle anzuzeigen scheinen, wenn sie als Nachrichtenauthentifizierungscode verwendet wird. ."
Auf unzureichend gesicherten Systemen kann ein Timing-Angriff durchgeführt werden, um HMAC Ziffer für Ziffer zu ermitteln. [ 12 ]
HMAC-Beispiele (MD5, SHA1, SHA256)
Hier sind einige leere HMAC-Werte:
HMAC_MD5("", "") = 0x74e6f7298a9c2d168935f58c001bad88
HMAC_SHA1("", "") = 0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d
HMAC_SHA256("", "") = 0xb613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad
Hier sind einige nicht leere HMAC-Werte unter der Annahme einer 8-Bit- ASCII- oder UTF-8- Codierung:
HMAC_MD5("Schlüssel", "Der schnelle braune Fuchs springt über den faulen Hund") = 0x80070713463e7749b90c2dc24911e275
HMAC_SHA1("Schlüssel", "Der schnelle braune Fuchs springt über den faulen Hund") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
HMAC_SHA256("Schlüssel", "Der schnelle braune Fuchs springt über den faulen Hund") = 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
--
Referenzen
- ^ a b Bellare, Mihir ; Canetti, Ran; Krawczyk, Hugo (1996). "Keying-Hash-Funktionen für die Nachrichtenauthentifizierung" .
- ↑ RFC 2104 , Abschnitt 2, „Definition von HMAC“, Seite 3.
- ↑ hmac – Keyed-Hashing for Message Authentication , Python Software Foundation , abgerufen am 7. Mai 2014 .
- ↑ PHP:hash_hmac – Manual , The PHP Group , abgerufen am 13.09.2015 .
- ↑ Keccak-Team. "Stärken von Keccak - Design und Sicherheit" . Abgerufen am 30. Januar 2013 . « Im Gegensatz zu SHA-1 und SHA-2 hat Keccak keine Längenerweiterungsschwäche und benötigt daher nicht die verschachtelte HMAC-Konstruktion. Stattdessen kann die MAC-Berechnung durchgeführt werden, indem der Nachricht einfach der Schlüssel vorangestellt wird. ».
- ↑ Bruce Schneier (August 2005). SHA-1 defekt . Abgerufen am 9. Januar 2009 . « obwohl es Anwendungen wie HMAC nicht betrifft, bei denen Kollisionen keine Rolle spielen ».
- ↑ IETF (Februar 1997). „RFC 2104“ . Abgerufen am 3. Dezember 2009 . « Der stärkste bekannte Angriff gegen HMAC basiert auf der Häufigkeit von Kollisionen für die Hash-Funktion H ("Geburtstagsangriff") [PV,BCK2] und ist für minimal sinnvolle Hash-Funktionen völlig unpraktisch. ».
- ^ Bellare, Mihir (Juni 2006). „Neue Beweise für NMAC und HMAC: Sicherheit ohne Kollisionsresistenz“ . In Dwork, Cynthia, Hrsg. Fortschritte in der Kryptologie – Crypto 2006 Proceedings . Skript zur Vorlesung Informatik 4117. Springer-Verlag . Abgerufen am 25. Mai 2010 . « Dieses Papier beweist, dass HMAC eine PRF ist, unter der alleinigen Annahme, dass die Kompressionsfunktion eine PRF ist. Dies stellt eine beweisbasierte Garantie wieder her, da keine bekannten Angriffe die Pseudozufälligkeit der Komprimierungsfunktion gefährden, und es hilft auch, die Angriffsresistenz zu erklären, die HMAC selbst bei Implementierung mit Hash-Funktionen gezeigt hat, deren (schwache) Kollisionsresistenz beeinträchtigt ist. ».
- ↑ Jong-sung, Kim; Birjukow, Alex; Prenel, Bart; Hong, Seokhie (2006). Zur Sicherheit von HMAC und NMAC Basierend auf HAVAL, MD4, MD5, SHA-0 und SHA-1 . Archiviert vom Original am 12. Mai 2013 . Abgerufen am 2. November 2015 .
- ↑ Wang, Xiaoyun; Yu, Hongbo; Wang, Wei; Zhang, Hainan; Zhan, Tao (2009). Kryptoanalyse auf HMAC/NMAC-MD5 und MD5-MAC . Abgerufen am 15. Juni 2015 .
- ^ "RFC 6151 - Aktualisierte Sicherheitsüberlegungen für den MD5-Message-Digest und die HMAC-MD5-Algorithmen" . Internettechnik-Arbeitsgruppe. März 2011 . Abgerufen am 15. Juni 2015 .
- ↑ Kurz erwähnt am Ende dieser Session Sebastian Schinzel: Time is on my Side - Exploiting Timing Side Channel Vulnerabilities on the Web 28th Chaos Communication Congress, 2011.
- Anmerkungen
- Mihir Bellare, Ran Canetti und Hugo Krawczyk, Keying Hash Functions for Message Authentication, CRYPTO 1996, S. 1–15 (PS oder PDF) .
- Mihir Bellare, Ran Canetti und Hugo Krawczyk, Nachrichtenauthentifizierung mit Hash-Funktionen: Die HMAC-Konstruktion, CryptoBytes 2(1), Frühjahr 1996 (PS oder PDF) .
Externe Links
- RFC2104
- Online-HMAC-Rechner für Dutzende von zugrunde liegenden Hash-Algorithmen Archiviert am 11. Juli 2017 auf der Wayback Machine .
- Online-HMAC-Generator/Tester-Tool
- FIPS PUB 198-1, der Keyed-Hash Message Authentication Code (HMAC)
- PHP-HMAC-Implementierung
- Python-HMAC-Implementierung
- Perl-HMAC-Implementierung
- Ruby-HMAC-Implementierung
- CHMAC-Implementierung
- C++ HMAC-Implementierung (Teil von Crypto++)
- Placement Master / Tester-Tool
- Java-Implementierung
- Implementierung von JavaScript MD5 und SHA HMAC
- JavaScript-SHA-only-HMAC-Implementierung
- .NETs System.Security.Cryptography.HMAC
- Delphi/Free Pascal-Implementierung
- Curl-zu-HTTP-Anfragekonverter