Verwenden eines symmetrischen Schlüssels (AES-128) zum Signieren und Verifizieren einer Nachricht

8

Ich möchte wissen, dass symmetrische Schlüssel verwendet werden können, um eine Nachricht zu signieren? Wir können den geteilten geheimen Schlüssel verwenden. Auch wenn ein symmetrischer Schlüssel zum Signieren verwendet wird, welche API kann in JAVA verwendet werden, um den Schlüssel zu laden und die Nachricht zu signieren?

Wenn ich Signature von java.security verwendet habe, hat es ein api initSign, aber das nimmt den privaten Schlüssel aus dem öffentlichen / privaten Schlüsselpaar als Argument zum Signieren der Nachricht. Hier ist der Schlüssel ein symmetrischer Schlüssel.

Irgendwelche Zeiger?

    
user839917 28.11.2011, 17:27
quelle

3 Antworten

11

Ein gemeinsamer geheimer Schlüssel kann verwendet werden, um einen Message Authentication Code (MAC) zu berechnen, der dann verwendet werden kann Bestätigen Sie die Integrität und Authentizität der Nachricht gegenüber einer anderen Partei, die dasselbe gemeinsame Geheimnis kennt. Im Gegensatz zu digitalen Signaturen, die mit dem privaten Schlüssel erstellt und mit dem öffentlichen Schlüssel verifiziert werden, bieten MACs keine Nichtabstreitbarkeit (jeder, der den MAC verifizieren kann, kann auch einen MAC für eine andere Nachricht generieren).

Es gibt verschiedene Formen von Nachrichtenauthentifizierungscodes; wahrscheinlich die am häufigsten verwendete Variante ist HMAC .

    
Sergey Vlasov 28.11.2011 17:56
quelle
6

Symmetrische Algorithmen können nicht die Nichtabstreitbarkeitseigenschaft geben, die asymmetrische Signaturschemata geben, dh der Empfänger einer Nachricht kann nicht beweisen, dass er die Nachricht nicht selbst erstellt hat, da sie das Schema kennen müssen. p>

Das heißt, ein Nachrichtenauthentifizierungscode (MAC) kann Ihnen geben, was Sie wollen : Sowohl Absender als auch Empfänger haben einen gemeinsamen Schlüssel, der Sender berechnet einen MAC mit dem Geheimnis und hängt ihn an die Nachricht an, und der Empfänger berechnet den gleichen MAC und vergleicht ihn mit der empfangenen Nachricht.

Obwohl der am häufigsten verwendete MAC-Typ ( HMAC ) auf Hash-Funktionen basiert, gibt es auch solche, die darauf basieren auf einer Blockchiffre wie AES, wie CBC-MAC (das ist wie CBC, aber mit Null-Initialisierungsvektor und Verwendung von nur der letzte Block als Ausgabe). (Wie von Noloader gesagt, ist CBC-MAC nicht der sicherste Weg, dies zu tun, verwenden Sie andere Modi.)

In den meisten Fällen, in denen Sie eine Verschlüsselung verwenden, sollten Sie die Nachrichtenauthentifizierung verwenden, da viele Verschlüsselungsschemas anfällig für ausgewählte Klartextangriffe sind.

In Java kann eine MAC berechnet (und geprüft) werden, indem javax.crypto.Mac Klasse.

    
Paŭlo Ebermann 28.11.2011 18:10
quelle
1

Wenn Sie eine Nachricht mit einem symmetrischen Schlüssel signieren möchten, möchten Sie einen CMAC basierend auf AES (oder 3-Tasten TDEA oder Cameilla) verwenden. CMACs sind Message Authentication Codes (MAC), die über Blockchiffren aufgebaut sind. In der Regel verwenden Sie einen CMAC, wenn Sie AES / 3TDEA / Cameilla auch zur Verschlüsselung verwenden (dh es ist praktisch).

Sie können auch einen HMAC verwenden. Ein HMAC ist ein Message Authentication Code (MAC), der auf einem Hash aufgebaut ist. Du würdest einen HMAC verwenden, ist ein Hash im Programm bereits vorhanden (dh es war praktisch).

Wenn im Programm sowohl eine Block-Chiffre als auch ein Hash vorhanden sind, verwende ich im Allgemeinen einen HMAC, weil er schneller ist.

Schließlich (zur Vollständigkeit), verwenden Sie nicht MD5. Es ist kaputt (trotz was viele in der freien Software Welt denken). SHA-1 ist für neue Anwendungen von Stellen wie NIST, NESSIE und ECRYPT nicht mehr zugelassen. Verwenden Sie die SHA-2-Hash-Familie oder verwenden Sie Whirlpool.

Die Java-spezifischen Erweiterungen finden Sie unter Java Cryptography Extensions .

    
jww 28.11.2011 18:09
quelle