Nachrichtenauthentifizierung mit HMAC in der Kryptographie

LinuxBeginner
Jetzt üben

Einführung

In der Welt der digitalen Kommunikation ist es entscheidend sicherzustellen, dass Nachrichten nicht nur privat bleiben, sondern auch während der Übertragung nicht manipuliert wurden (Integrität) und dass sie tatsächlich vom angegebenen Absender stammen (Authentizität). Während einfache Hash-Funktionen eine versehentliche Datenkorruption überprüfen können, verhindern sie keine böswillige Manipulation, da jeder den Hash einer geänderten Nachricht neu berechnen kann.

Hier kommt HMAC (Hash-based Message Authentication Code) ins Spiel. HMAC ist ein spezifischer Typ eines Message Authentication Code (MAC), der eine kryptografische Hash-Funktion (wie SHA-256) mit einem geheimen Schlüssel kombiniert. Nur Parteien, die im Besitz des geheimen Schlüssels sind, können den HMAC für eine gegebene Nachricht generieren und verifizieren. Dieser Prozess gewährleistet sowohl Datenintegrität als auch Authentizität.

In diesem Lab sammeln Sie praktische Erfahrungen mit HMAC. Sie beginnen damit, das Konzept zu verstehen, verwenden dann das leistungsstarke Kommandozeilen-Tool openssl, um Schlüssel zu generieren und HMACs zu berechnen. Schließlich sehen Sie, wie HMAC in einem Python-Skript implementiert wird, was eine gängige Aufgabe in der Anwendungsentwicklung ist.

Einführung in HMAC

In diesem Schritt behandeln wir das grundlegende Konzept von HMAC und warum es für sichere Kommunikation unerlässlich ist.

Eine Standard-Hash-Funktion, wie SHA-256, nimmt eine Eingabenachricht entgegen und erzeugt eine Zeichenfolge fester Größe, bekannt als Hash oder Digest. Wenn sich auch nur ein einziges Bit der Nachricht ändert, wird der resultierende Hash völlig anders sein. Dies ist hervorragend geeignet, um die Datenintegrität zu überprüfen. Es bietet jedoch keine Authentizität. Wenn ein Angreifer eine Nachricht abfängt und verändert, kann er einfach einen neuen Hash für die manipulierte Nachricht berechnen und diese mitsenden. Der Empfänger hätte keine Möglichkeit zu wissen, dass die Nachricht verändert wurde.

HMAC löst dieses Problem, indem es einen geheimen symmetrischen Schlüssel in den Hashing-Prozess einbezieht. Ein symmetrischer Schlüssel ist eine geheime Information, die nur zwischen dem Absender und dem vorgesehenen Empfänger geteilt wird.

Der HMAC-Prozess funktioniert ungefähr wie folgt:

  1. Der Absender kombiniert den geheimen Schlüssel mit der Nachricht.
  2. Auf diese Kombination wird eine Hash-Funktion (z. B. SHA-256) angewendet.
  3. Der resultierende Hash, nun HMAC genannt, wird zusammen mit der ursprünglichen Nachricht gesendet.

Wenn der Empfänger die Nachricht und den HMAC erhält, führt er dieselbe Berechnung unter Verwendung seiner Kopie des geheimen Schlüssels durch.

  • Stimmt der berechnete HMAC mit dem empfangenen HMAC überein, weiß der Empfänger, dass die Nachricht nicht verändert wurde (Integrität) und dass sie von jemandem stammt, der den geheimen Schlüssel besitzt (Authentizität).
  • Stimmen die HMACs nicht überein, wird die Nachricht als kompromittiert betrachtet und verworfen.

Dieser Schritt ist rein konzeptionell. In den folgenden Schritten werden Sie diese Theorie in die Praxis umsetzen.

HMAC-Schlüssel generieren

In diesem Schritt generieren Sie einen sicheren, zufälligen geheimen Schlüssel, der die Grundlage für die Sicherheit von HMAC bildet. Ein vorhersagbarer Schlüssel würde es einem Angreifer ermöglichen, HMACs zu fälschen. Wir werden das Tool openssl verwenden, ein vielseitiges Kommandozeilen-Dienstprogramm für Kryptografie.

Wir verwenden den Befehl openssl rand, um Zufallsdaten zu generieren.

  • -hex: Diese Option weist openssl an, die Zufallsdaten als hexadezimale Zeichenfolge auszugeben.
  • 32: Dies gibt die Anzahl der zu generierenden Zufallsbytes an. 32 Bytes entsprechen 256 Bits, was eine starke und häufig verwendete Schlüssellänge ist, insbesondere in Verbindung mit dem SHA-256 Hash-Algorithmus.

Um den Schlüssel für nachfolgende Befehle einfach verwenden zu können, generieren wir ihn und speichern ihn in einer Umgebungsvariable namens HMAC_KEY. Führen Sie den folgenden Befehl in Ihrem Terminal aus:

export HMAC_KEY=$(openssl rand -hex 32)

Dieser Befehl führt openssl rand -hex 32 aus, und dessen Ausgabe (der Hex-Schlüssel) wird erfasst und der Variablen HMAC_KEY zugewiesen.

Sie können den gerade generierten Schlüssel anzeigen, indem Sie den Befehl echo verwenden:

echo $HMAC_KEY

Sie sollten eine lange Zeichenfolge hexadezimaler Zeichen sehen. Ihr Schlüssel wird einzigartig sein.

0db348c78473ce8460416f875cd87239d0f5f66fbe5103ba4b5c84cf2cd76914

Nachdem Sie nun einen geheimen Schlüssel haben, sind Sie bereit, einen HMAC zu erstellen.

HMAC-SHA256 berechnen

In diesem Schritt berechnen Sie einen HMAC für eine Beispielnachricht unter Verwendung des von Ihnen generierten Schlüssels. Zuerst erstellen wir eine Datei, die unsere Nachricht enthält.

Wir verwenden den Befehl echo, um eine Datei namens message.txt zu erstellen. Das Flag -n ist wichtig, da es verhindert, dass echo am Ende der Zeichenfolge ein Zeilenumbruchzeichen hinzufügt, was den Inhalt und damit den endgültigen HMAC verändern würde.

echo -n "This is a secret message." > message.txt

Nun können wir mit der Nachricht und dem Schlüssel den HMAC berechnen. Wir verwenden den Befehl openssl dgst, der zur Berechnung von Message Digests (Hashes) dient.

  • -sha256: Gibt an, dass wir den SHA-256 Hash-Algorithmus verwenden möchten.
  • -mac hmac: Gibt an, dass wir einen Message Authentication Code (MAC) unter Verwendung der HMAC-Methode berechnen möchten.
  • -macopt hexkey:$HMAC_KEY: Dies liefert die Optionen für den MAC-Algorithmus. Hier geben wir an, dass unser Schlüssel im Hexadezimalformat (hexkey) vorliegt, und übergeben den Schlüssel selbst mithilfe der Umgebungsvariable $HMAC_KEY, die wir zuvor erstellt haben.
  • message.txt: Die Eingabedatei, die die zu authentifizierenden Daten enthält.

Führen Sie den folgenden Befehl aus, um den HMAC zu generieren:

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Die Ausgabe ist der HMAC-Digest für Ihre Nachricht, berechnet mit Ihrem geheimen Schlüssel. Das Ausgabeformat zeigt den verwendeten Algorithmus und den resultierenden HMAC-Wert an.

HMAC-SHA2-256(message.txt)= 214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Dieser HMAC-Wert ist das, was Sie zusammen mit Ihrer Nachricht an einen Empfänger senden würden, der ebenfalls den geheimen Schlüssel besitzt.

HMAC-Integrität überprüfen

In diesem Schritt sehen Sie den HMAC-Verifizierungsprozess in Aktion. Sie werden beobachten, wie die Verwendung des korrekten Schlüssels erfolgreich ist, während die Verwendung eines falschen Schlüssels oder einer modifizierten Nachricht zu einem Fehlschlag führt.

Verifizierung mit dem korrekten Schlüssel

Verifizierung ist kein spezieller Befehl; es ist einfach die Handlung des Empfängers, den HMAC selbst neu zu berechnen und ihn mit dem erhaltenen Wert zu vergleichen. Wenn Sie den Befehl aus dem vorherigen Schritt erneut ausführen, erhalten Sie exakt denselben HMAC-Wert. Dies bestätigt, dass der HMAC konsistent ist, solange der Schlüssel und die Nachricht unverändert bleiben.

Beobachtung des Fehlschlags mit einem falschen Schlüssel

Nun simulieren wir einen Angreifer oder eine fehlerhafte Konfiguration, indem wir versuchen, die Nachricht mit einem anderen Schlüssel zu verifizieren. Generieren Sie zuerst einen neuen, "falschen" Schlüssel:

export WRONG_KEY=$(openssl rand -hex 32)

Versuchen Sie nun, den HMAC für die ursprüngliche message.txt zu berechnen, aber unter Verwendung dieses WRONG_KEY:

openssl dgst -sha256 -mac hmac -macopt hexkey:$WRONG_KEY message.txt

Sie werden einen neuen HMAC-Wert in der Ausgabe sehen:

HMAC-SHA2-256(message.txt)= 781729497e89f3f9cb1d8c7ab632e22753062ac39cd64de0e5b81a45de245d78

Beachten Sie, dass dieser HMAC völlig anders ist als der, den Sie mit dem korrekten $HMAC_KEY generiert haben. Dies demonstriert, dass ohne den korrekten geheimen Schlüssel kein gültiger HMAC für die Nachricht erzeugt werden kann, wodurch die Authentizität gewährleistet wird.

Beobachtung des Fehlschlags bei einer modifizierten Nachricht

Sehen wir uns auch an, was passiert, wenn die Nachricht selbst manipuliert wird. Wir werden message.txt leicht ändern:

echo -n "This is a tampered message." > message.txt

Berechnen Sie nun den HMAC erneut unter Verwendung des ursprünglichen, korrekten Schlüssels ($HMAC_KEY):

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Auch hier erhalten Sie einen völlig anderen HMAC-Wert. Dies beweist, dass jede noch so kleine Änderung an der Nachricht erkannt wird, wodurch die Integrität gewährleistet wird.

HMAC in Python implementieren

In diesem Schritt lernen Sie, wie Sie HMAC-Operationen programmatisch mit Python durchführen. Dies ist eine gängige Anforderung in Webanwendungen, APIs und anderer Software, die die Nachrichtensicherheit gewährleisten muss. Pythons Standardbibliothek stellt hierfür die Module hmac und hashlib bereit.

Wir schreiben ein einfaches Python-Skript, um den HMAC-SHA256 einer Nachricht zu berechnen. Öffnen Sie zunächst die Datei hmac_example.py mit dem Texteditor nano:

nano hmac_example.py

Kopieren Sie nun den folgenden Python-Code und fügen Sie ihn in den nano-Editor ein. Dieser Code importiert die notwendigen Bibliotheken, definiert einen Schlüssel und eine Nachricht und berechnet und druckt dann den HMAC.

Hinweis: Für dieses Beispiel sind der Schlüssel und die Nachricht fest codiert (hardcoded). In einer realen Anwendung würde der Schlüssel sicher gespeichert und verwaltet werden. Sowohl der Schlüssel als auch die Nachricht müssen Byte-Strings sein, daher stellen wir ihnen das Präfix b voran.

import hmac
import hashlib

## Der geheime Schlüssel (muss Bytes sein)
## In einer realen Anwendung sollte dieser von einem sicheren Ort abgerufen werden
key = b'\x0d\xb3\x48\xc7\x84\x73\xce\x84\x60\x41\x6f\x87\x5c\xd8\x72\x39\xd0\xf5\xf6\x6f\xbe\x51\x03\xba\x4b\x5c\x84\xcf\x2c\xd7\x69\x14'

## Die zu authentifizierende Nachricht (muss Bytes sein)
message = b'This is a secret message.'

## 1. Ein neues HMAC-Objekt erstellen
##    - Schlüssel übergeben
##    - Nachricht übergeben
##    - Hash-Algorithmus angeben (aus hashlib)
h = hmac.new(key, message, hashlib.sha256)

## 2. Den Digest im Hexadezimalformat abrufen
hex_digest = h.hexdigest()

print("HMAC Digest:")
print(hex_digest)

Nach dem Einfügen des Codes speichern Sie die Datei und beenden nano, indem Sie Ctrl+O drücken, dann Enter, um den Dateinamen zu bestätigen, und schließlich Ctrl+X, um zu beenden.

Führen Sie nun Ihr Python-Skript im Terminal aus:

python3 hmac_example.py

Das Skript wird ausgeführt und gibt den berechneten HMAC-Digest aus.

HMAC Digest:
214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Sie haben nun erfolgreich die HMAC-Generierung in Python implementiert, eine Fähigkeit, die direkt für die Entwicklung sicherer Software anwendbar ist.

Zusammenfassung

In diesem Lab haben Sie praktische Erfahrungen mit Hash-based Message Authentication Codes (HMACs) gesammelt, einem Eckpfeiler der modernen Kryptographie zur Gewährleistung von Datenintegrität und Authentizität.

Sie haben gelernt, dass:

  • HMAC eine kryptografische Hash-Funktion mit einem geheimen Schlüssel kombiniert, um einen Nachrichtenauthentifizierungscode zu erstellen.
  • Nur Parteien, die im Besitz des geheimen Schlüssels sind, können den HMAC generieren oder verifizieren, wodurch unbefugte Änderungen und Fälschungen verhindert werden.
  • Das Kommandozeilen-Tool openssl ein leistungsstarkes Dienstprogramm zur Durchführung kryptografischer Operationen ist, einschließlich der Generierung von Zufallsschlüsseln (openssl rand) und der Berechnung von HMACs (openssl dgst).
  • Jede Änderung an der Nachricht oder die Verwendung eines falschen Schlüssels führt zu einem völlig anderen HMAC, wodurch Manipulation leicht erkennbar wird.
  • Python die Bibliotheken hmac und hashlib bereitstellt, um die HMAC-Funktionalität einfach in Ihre Anwendungen zu integrieren.

Durch die Beherrschung von HMAC haben Sie einen wichtigen Schritt beim Aufbau sichererer und vertrauenswürdigerer Systeme gemacht.