Technischer Beitrag
Aufbau eines MAC-Befehls
Viele Kunden von ID TECH interessieren sich für Point-to-Point-Verschlüsselung (P2PE), und im Rahmen ihrer Bemühungen, die strengen P2PE-Anforderungen des PCI zu erfüllen, ziehen Kunden häufig SRED (Secure Reading and Exchange of Data)-Zahlungsgeräte in Betracht. Solche Geräte verschlüsseln Daten nicht nur am Erfassungspunkt (wie es alle Geräte von ID TECH können), sondern verfügen darüber hinaus über Manipulationsschutz, automatische Datenlöschung (Zeroization) im Falle einer Manipulation sowie weitere spezialisierte Sicherheitsfunktionen.
Zu den wichtigsten dieser „weiteren spezialisierten Sicherheitsfunktionen" gehört die sogenannte MAC-Authentifizierung von Befehlen.
In der Kryptografie ist ein Message Authentication Code (MAC) ein kurzer Code, der es dem Empfänger einer Nachricht ermöglicht, diese zu authentifizieren – also zu bestätigen, dass die Nachricht von einem vertrauenswürdigen Absender stammt. Der MAC-Wert schützt sowohl die Datenintegrität als auch die Authentizität einer Nachricht, indem er die Nachricht mit einem gemeinsamen Geheimnis kombiniert, das sowohl dem Sender als auch dem Empfänger bekannt ist. Die Nachricht selbst wird im Klartext übermittelt, jedoch wird zusätzlich die Kombination aus Nachricht und MAC (der das verschlüsselte Geheimnis enthält) gesendet. Jeder, der das Geheimnis kennt, kann feststellen, ob die Nachricht (einschließlich des enthaltenen MAC) von jemandem stammt, der Zugang zu demselben Geheimnis hat.
In den SRED-basierten Kartenlesern von ID TECH sind bestimmte sicherheitsrelevante Befehle durch einen MAC geschützt. Das bedeutet, dass das Gerät einen Befehl nur ausführt, wenn dieser mit einem MAC-Hash übermittelt wird, der verifiziert werden kann – und zwar mithilfe eines bereits im Gerät gespeicherten Schlüssels. Der Absender des Befehls muss den MAC-Hash mit demselben Schlüssel erstellen, den das Gerät zur Validierung verwendet.
Ein Beispiel kann dies verdeutlichen.
Angenommen, Sie möchten Datum und Uhrzeit an einem ID TECH Augusta S Kartenleser einstellen, bei dem es sich um ein SRED-Gerät handelt. Der Befehl „Datum und Uhrzeit setzen" gilt als sicherheitsrelevant, da es unbefugten Parteien nicht gestattet sein sollte, Transaktionen rückzudatieren oder anderweitig zu manipulieren. Weitere „sicherheitsrelevante" Befehle sind beispielsweise Befehle zum Hinzufügen oder Entfernen von Karten aus einer Whitelist oder zum Ändern der Zertifikatsperrliste (Certificate Revocation List) des Geräts.
Normalerweise wird Datum und Uhrzeit eines Nicht-SRED Augusta-Geräts über den Firmware-Befehl 78 53 01 50 gesetzt, gefolgt von der Payload-Länge (0x08), dann der Datum/Uhrzeit-Länge (0x06), dann den sechs Bytes für Datum und Uhrzeit im Format JJ MM TT HH MM SS, gefolgt von der „MAC-Länge", die bei einem Nicht-SRED-Gerät null beträgt. Bei Augusta S gilt dieselbe Formel, mit dem Unterschied, dass die Payload-Länge 0x26 und die „MAC-Länge" 0x1E beträgt, da am Ende 30 zusätzliche Bytes als „MAC-Payload" angehängt werden.
Bei Augusta muss der gesamte Befehl natürlich im NGA-Protokoll von ID TECH formatiert werden. Dabei werden STX (0x02) und zwei Little-Endian-Längenbytes an den Anfang der Befehlsstruktur gestellt sowie LRC, Prüfsumme und ETX (0x03) an das Ende. Die fertige MAC-Version des vollständigen Befehls sieht folgendermaßen aus (Befehlsbytes in Gelb):
02 2B 00 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD 0A 00 62 99 49 00 00 00 00 00 00 02 EB F9 03
Gehen wir die Struktur Abschnitt für Abschnitt durch:
02 ist STX.
2B 00 ist die (Little-Endian-)Länge der gesamten Struktur, ohne den abschließenden LRC/Prüfsumme/ETX-Trailer.
78 53 01 50 ist der Firmware-Befehl zum Setzen von Datum und Uhrzeit.
26 (hex) bedeutet, dass 38 Bytes Payload folgen.
06 bedeutet, dass Datum/Uhrzeit aus 6 Bytes besteht, nämlich:
17 11 10 09 15 00 — 10. November 2017, 09:15:00 Uhr.
1E bedeutet, dass 30 Bytes MAC-Nutzdaten folgen.
10 00 ist ein Little-Endian-Längenwert von 16 (da alle ID TECH MAC-Hashes 16 Bytes lang sind).
4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD ist der 16-Byte-MAC-Hash bzw. „HMAC".
0A 00 ist ein Little-Endian-Längenwert von 10 für den nachfolgenden KSN.
62 99 49 00 00 00 00 00 00 02 ist der MAC-KSN.
EB ist der LRC-Wert (Longitudinal Redundancy Check).
F9 ist die 8-Bit-Prüfsumme über alle Bytes von 78 bis zum letzten KSN-Byte (02).
03 ist ETX (End of Transmission, Übertragungsende).
Die Konstruktion dieses Befehls ist grundsätzlich unkompliziert. Die erklärungsbedürftigen Teile sind der KSN und der HMAC (der Hash selbst).
MAC KSN
Der MAC KSN (Key Serial Number) muss zum Zeitpunkt des Bedarfs direkt vom Gerät abgefragt werden. Wer mit ANSI X9.24-1 (dem Standard für gerätespezifische Einmalschlüssel pro Transaktion, DUKPT)vertraut ist, weiß, dass der KSN ein 10-Byte-Wert ist, dessen untere 21 Bits einen Zähler bilden, der nach jeder Verwendung inkrementiert wird. Was dabei oft übersehen wird: Enthält ein Gerät mehrere DUKPT-Schlüssel (etwa für Daten, MAC und PIN), verfügt jeder über einen eigenen dedizierten KSN, der unabhängig von den anderen inkrementiert wird. Der KSN ist jedoch ein öffentlicher Wert und kann im ID TECH Augusta jederzeit mit dem vollständig formatierten Befehl 02090078463e040005010000000603 abgefragt werden.
Der KSN ist von zentraler Bedeutung, da er in die Berechnung des MAC-Schlüssels einfließt, der pro Verwendung eindeutig ist und somit nicht für Replay-Angriffe anfällig ist. Weitere Informationen zu KSNs und zur DUKPT-Schlüsselableitung finden Sie in meinem früheren zweiteiligen Beitrag zu diesem Thema.
HMAC-ABLEITUNG
Jetzt wird es technisch.
HMAC (siehe RFC 2104) ist ein branchenweit anerkanntes Verfahren zur Erstellung von MAC-Hashes unter Verwendung von:
- — ein einmaliger 128-Bit-Schlüssel
- — eine beliebige Nachrichtennutzlast
- — SHA-256-Hashing
Der betreffende Schlüssel wird dynamisch mithilfe des MAC KSN und des IPEK des Geräts (der seinerseits aus einem BDK abgeleitet wird) gemäß den standardmäßigen DUKPT-Regeln abgeleitet. Diese Regeln sehen eine bestimmte Methode zur Ableitung eines MAC-Schlüssels vor (im Gegensatz zu einem Datenschlüssel oder PIN-Schlüssel). Alles wird beschrieben in meinem früheren zweiteiligen Beitrag
Der gefürchtete HMAC-Hash wird nach folgendem, auf den ersten Blick erschreckend wirkenden Schema berechnet:
H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )
Lassen Sie sich davon nicht abschrecken. Es ist tatsächlich gut nachvollziehbar. Der Wert K ist der 128-Bit-Schlüssel. K' (K-Strich) bezeichnet denselben Schlüssel, mit Nullen auf eine Gesamtlänge von 64 Byte aufgefüllt.
Der ipad (inner pad) ist einfach die Konstante 36363636… wiederholt bis zu einer Länge von 64 Bytes.
K' ⊕ ipad bedeutet, den mit Nullen aufgefüllten Schlüssel mit dem ipad-Wert mittels exklusivem ODER (auch XOR genannt) zu verknüpfen – eine bitweise arithmetische Operation, die bei Informatik-Enthusiasten sehr beliebt ist.
K' ⊕ ipad) ‖ m bedeutet, die Nachricht (m) an den oben ermittelten Wert anzuhängen. Die Bytes werden einfach am Ende hinzugefügt. (Die Länge beträgt nun mehr als 64 Bytes – das ist kein Problem.)
H( (K' ⊕ ipad) ‖ m) bedeutet, die Hash-Funktion (in diesem Fall SHA-256) auf den gesamten Wert in den Klammern anzuwenden.
Sobald dieser Schritt abgeschlossen ist, wird das Ergebnis an K' ⊕ opadangehängt, wobei opad (der outer pad) eine Konstante ist, die aus 5C5C5C5C… bis zu einer Länge von 64 Bytes besteht. Anschließend wird der gesamte Wert erneut gehasht.
Falls Sie sich fragen sollten: Die Werte für ipad und opad wurden von den ursprünglichen Autoren dieses Algorithmus willkürlich gewählt, jedoch so, dass der Hamming-Abstand (also die bitweisen Unterschiede) zwischen der vorderen und hinteren Hälfte des Hashes maximiert wird. Das Hashing erfolgt in zwei Hälften in verschachtelter Form, um verschiedene Arten von Manipulation zu verhindern.
Um Ihnen bei der Erstellung von HMAC-Werten zu helfen, hat ID TECH ein HTML-Formular online bereitgestellt hier, in das Sie KSN- und BDK-Werte (Root-Key) eingeben, Ihren MAC-Schlüssel ableiten und HMAC verwenden können, um einen 32-Byte-MAC-Hash (über SHA-256) zu erstellen. Probieren Sie unbedingt die Option „Generate HMAC (with verbose output)" aus dem Dropdown-Menü oben im Formular aus. Sie erhalten eine sehr praktische ausführliche Ausgabe, die klar und verständlich erklärt, wie jedes Element des HMAC-Puzzles aussieht.
Wenn Sie unser Online-Tool verwenden, um einen MAC-Schlüssel mit einem KSN von 62 99 49 00 00 00 00 00 00 02 und einem Root-Key (BDK) von 0123456789ABCDEFFEDCBA9876543210 zu generieren – dem ANSI-Standard-Testschlüssel –, sollte Ihr MAC-Schlüssel den Wert 3E4A480ACE8B239B9539E6053EAB03D9 haben. Wenn Sie den HMAC-Algorithmus auf eine Nutzlast von 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 mit diesem Schlüssel anwenden, sollten Sie einen 32-Byte-HMAC-Hash erhalten, dessen erste 16 Bytes den Wert 4EC7DFCF04D33CC6EC6F50920086A1DD haben. (ID TECH verwendet nur die ersten 16 Bytes.) Dies ist der „magische Fingerabdruck", der dem Befehl „Set Date and Time" hinzugefügt wird. Der Kartenleser analysiert die Klartextnutzlast-Bytes und nutzt seinen eigenen KSN sowie den internen Schlüsselableitungscode, um denselben HMAC-Wert zu ermitteln, den Sie in Ihren Befehl eingebettet haben. Dadurch wird bestätigt, dass der Befehl von einer Quelle stammen muss, die den geheimen BDK (0123456789ABCDEFFEDCBA9876543210) kennt – also von einer vertrauenswürdigen Quelle.
Haben Sie Fragen zu DUKPT? HMAC? SRED? P2PE? Nehmen Sie Kontakt mit unseren Experten auf. Wir helfen Ihnen gerne weiter:
