it-swarm.com.de

Was sind die Anforderungen für den geheimen HMAC-Schlüssel?

Ich erstelle einen HTTP REST Service, der nur über TLS verfügbar ist.

Zur Authentifizierung plane ich, für jeden Benutzer mit HMAC HS256 JWT Token zu generieren. Ich brauche einen geheimen Schlüssel für HMAC.

Was sind die Anforderungen für geheimer Schlüssel?

Benötige ich eine lange Folge zufälliger Zeichen? Oder String mit fester Länge? Oder was?

52
ivstas

Ich habe meine Antwort hier hinzugefügt, da ich der Meinung bin, dass die vorhandenen Ihre Frage nicht direkt genug für meinen Geschmack beantworten.

Schauen wir uns RFC 4868 an (in Bezug auf IPSec, jedoch die HMAC-SHA256-Funktion, die Sie verwenden möchten - em mine ) ::

Blockgröße: Die Größe des Datenblocks, mit dem der zugrunde liegende Hash-Algorithmus arbeitet. Für SHA-256 sind dies 512 Bit , für SHA-384 und SHA-512 sind dies 1024 Bit.

Ausgabelänge: Die Größe des vom zugrunde liegenden Hash-Algorithmus erzeugten Hash-Werts. Für SHA-256 sind dies 256 Bit , für SHA-384 384 Bit und für SHA-512 512 Bit.

Als WhiteWinterWolf-Notizen wird davon abgeraten, länger als B zu sein, da der Wert zuerst mit SHA-256 gehasht werden muss (d. H. In diesem Fall 512 Bit) und weniger als L nicht empfohlen wird (in diesem Fall 256 Bit). Ein 256-Bit-Schlüssel ist jedoch übertrieben, da alles, was 128 Bit oder mehr beträgt, in der aktuellen Lebensdauer eines Menschen nicht brutal erzwungen werden kann, selbst wenn jeder Computer auf der Welt daran gearbeitet hat, ihn zu knacken.

Daher würde ich einen 128-Bit-Schlüssel empfehlen, der mit einem kryptografisch sicheren Pseudozufallszahlengenerator (CSPRNG) generiert wird. Wenn Sie dies als Text speichern möchten, kann ein 128-Bit-Schlüssel durch Generieren einer zufälligen Hex-Zeichenfolge mit einer Länge von 32 Zeichen dargestellt werden. Alternativ können Sie 16 zufällige Bytes generieren und diese dann über eine base64-Funktion ausführen.

40
SilverlightFox

Gemäß RFC 7518 - JSON-Webalgorithmen (JWA):

Bei diesem Algorithmus MUSS ein Schlüssel mit der gleichen Größe wie die Hash-Ausgabe (z. B. 256 Bit für "HS256") oder größer verwendet werden. (Diese Anforderung basiert auf Abschnitt 5.3.4 (Sicherheitseffekt des HMAC-Schlüssels) von NIST SP 800-117 (sic) [ NIST.800-107 ] , der besagt, dass die effektive Sicherheitsstärke das Minimum der Sicherheitsstärke des Schlüssels und das Zweifache der Größe des internen Hashwerts ist.)

Im Fall von JWT MÜSSEN Sie bei HS256 einen Schlüssel mit mindestens 256 Bit verwenden.

18
jordanbtucker

Der RFC 2104 , der HMAC-Funktionen definiert, beantwortet diese Frage:

Der Schlüssel für HMAC kann beliebig lang sein (Schlüssel, die länger als B Bytes sind, werden zuerst mit H gehasht). Von weniger als L Bytes wird jedoch dringend abgeraten, da dies die Sicherheitsstärke der Funktion verringern würde. Schlüssel, die länger als L Bytes sind, sind akzeptabel, aber die zusätzliche Länge würde die Funktionsstärke nicht wesentlich erhöhen. (Ein längerer Schlüssel kann ratsam sein, wenn die Zufälligkeit des Schlüssels als schwach angesehen wird.)

Die Schlüssel müssen zufällig ausgewählt (oder unter Verwendung eines kryptografisch starken Pseudozufallsgenerators, der mit einem zufälligen Startwert geimpft ist) und regelmäßig aktualisiert werden. (Aktuelle Angriffe geben keine bestimmte empfohlene Häufigkeit für Schlüsseländerungen an, da diese Angriffe praktisch nicht durchführbar sind. Eine regelmäßige Schlüsselaktualisierung ist jedoch eine grundlegende Sicherheitspraxis, die potenziellen Schwachstellen der Funktion und der Tasten entgegenwirkt und den Schaden eines exponierten Schlüssels begrenzt. )

Zur Information wird in diesem Auszug die folgende Notation verwendet:

Wir nehmen an, dass H eine kryptografische Hash-Funktion ist, bei der Daten durch Iteration einer grundlegenden Komprimierungsfunktion für Datenblöcke gehasht werden. Wir bezeichnen mit B die Bytelänge solcher Blöcke (B = 64 für alle oben genannten Beispiele für Hash-Funktionen) und mit L die Bytelänge der Hash-Ausgänge (L = 16 für MD5, L = 20 für SHA-1) ).

10
WhiteWinterWolf

EDIT: Falsche Antwort. Nicht gelöscht, um den Kommentarthread beizubehalten.


HMAC-Benutzereingabeschlüssel, die länger als die Blockgröße der spezifischen Hash-Algorithmen sind, werden zuerst gekürzt. (Indem Sie die langen Schlüssel durch den Hash laufen lassen und dann diesen Hash als eigentlichen Schlüssel verwenden.)

SHA256 gibt 256-Bit-Hashes aus. Das sind 32 Bytes. Ich schlage daher vor, dass Sie geheime 256-Bit-HMAC-Schlüssel generieren. (Verwenden eines kryptografisch sicheren Zufallsgenerators.) Schlüssel bieten keine zusätzliche Sicherheit mehr.

1
StackzOfZtuff