it-swarm.com.de

Wann sollte HMAC neben AES verwendet werden?

Einer meiner Kunden möchte jedem seiner Kunden eine URL zur Registrierung in einem System bereitstellen. Diese URL würde einen Abfragezeichenfolgenparameter mit einigen Daten (z. B. Code, E-Mail und Name) seiner Clients enthalten, die mit AES mit CBC verschlüsselt wurden, ähnlich wie folgt (IV ist fett gedruckt):

www.website.com/register?key=44a74fb9fad889496e970c604e54fdab

Wenn ein Benutzer diese Seite betritt, entschlüsselt er sie und prüft, ob die Daten gültig sind (z. B. ob der Code des Kunden in einer externen Datenbank gültig ist und nicht bereits registriert ist), um ihm das Registrierungsformular anzuzeigen.

Ich habe einige Leute gesehen, die HMAC neben AES zum Verschlüsseln von Daten verwenden, aber ich weiß nicht, ob dies in einem solchen Fall erforderlich ist. Meine Frage ist: Ist das sicher genug? Sollte ich etwas wie HMAC zusammen mit dem Klartext verwenden, bevor ich es mit AES verschlüssele, um die Daten zu authentifizieren?

23
Guilherme Sehn

AES ist Verschlüsselung ; es soll Vertraulichkeit wahren. Die Verschlüsselung behält Integrität selbst nicht bei: Ein Angreifer, der auf verschlüsselte Daten zugreifen kann, kann die Bytes ändern und dadurch die Klartextdaten beeinflussen (obwohl die Verschlüsselung die Aufgabe für den Angreifer etwas schwieriger macht, ist dies der Fall nicht so unmöglich wie oft angenommen).

Um Integrität zu erhalten, benötigen Sie einen MAC und HMAC ist ein Nice MAC Algorithmus.

In vielen Situationen, in denen eine Verschlüsselung vorgeschrieben ist, muss auch die Integrität aufrechterhalten werden, sodass AES "allein" in der Regel nicht ausreicht. In Ihrem Fall sind die potenziellen Angreifer die Kunden selbst. Jeder Kunde kann versuchen, die URL zu ändern, um auf die Daten einer anderen Person zuzugreifen oder sich unter einem anderen Namen oder so weiter registrieren zu können. So wie ich es verstehe, möchte Ihr "Kunde" der Meister der Registrierung bleiben; er möchte entscheiden, welcher Kunde sich unter welchem ​​Namen registrieren kann. Eine überprüfte Integrität ist daher erforderlich.


Es gibt verschiedene Möglichkeiten, AES-basierte Verschlüsselung mit HMAC zu kombinieren. Die meisten von ihnen sind schlecht. Siehe diese Frage für eine Diskussion zu diesem Thema. Um die Geschichte kurz zu machen:

  • Wenn Sie können, verwenden Sie GCM oder einen anderen Modus, der die harte Arbeit der sicheren Kombination von Verschlüsselung und MAC erledigt.

  • Wenn Sie GCM nicht verwenden können (mangels Unterstützung in Ihrem serverseitigen Programmierframework), müssen Sie Dinge im alten Stil tun:

    • Hash den Schlüssel [~ # ~] k [~ # ~] mit SHA-256, um 256 Bits "Schlüsselmaterial" zu erhalten. Teilen Sie das in zwei Hälften: 128 Bit für die Verschlüsselung ( K.e), 128 Bit für MAC ( K.m).
    • Generiere ein zufälliges [~ # ~] iv [~ # ~] von 128 Bits. Sie benötigen bei jeder Verschlüsselung eine neue und möchten diese mit einem starken PRNG (/dev/urandom) Generieren.
    • Füllen Sie die Daten auf (übliches PKCS # 5-Auffüllen), sodass ihre Länge ein Vielfaches der AES-Blockgröße (16 Byte) beträgt.
    • Verschlüsseln Sie die Daten mit AES im CBC-Modus mit der oben generierten IV und K.e als Schlüssel. Nennen wir [~ # ~] c [~ # ~] den resultierenden Chiffretext.
    • Berechnen Sie HMAC/SHA-256 mit dem Schlüssel K.m über die Verkettung von [~ # ~] iv [~ # ~] und [~ # ~] c [~ # ~] , in dieser Reihenfolge. Rufen Sie [~ # ~] m [~ # ~] den resultierenden Wert auf. Es ist entscheidend, dass [~ # ~] iv [~ # ~] Teil der Eingabe in HMAC ist.
    • Verketten [~ # ~] iv [~ # ~], [~ # ~] c [~ # ~] und [~ # ~] m [~ # ~], in dieser Reihenfolge. Dies ist Ihr "Registrierungsschlüssel".
    • Wenn Sie eine Registrierungsanforderung erhalten, überprüfen Sie zuerst den HMAC (indem Sie ihn neu berechnen) und fahren Sie dann (und erst dann) mit dem Entschlüsselungsschritt fort.

All dies setzt natürlich voraus, dass es einen Schlüssel [~ # ~] k [~ # ~] gibt, mit dem Ihr Kunde die Registrierungsschlüssel für die Kunden generieren kann, und dass Ihr Server weiß auch, um eingehende Registrierungsanforderungen zu überprüfen und zu entschlüsseln. Achten Sie wie bei allen Schlüsseln darauf, wo Sie sie aufbewahren.

38
Thomas Pornin