Wir verwenden den folgenden Code, um einen HMac-Hash gegen einen sensitiven Wert in C # zu erzeugen.
%Vor%Der übergebene Schlüssel ist eine 256-Bit-Basis-64-codierte Zeichenfolge. Es wurde eine Frage gestellt, ob wir HMACSHA256, HMACSHA384 oder HMACSHA512 verwenden sollten, um den Wert zu hashen.
Als eine Randnotiz; Muss der decodedKey
-Wert, den ich in den Konstruktor übergebe, ein 512-Bit-Schlüssel sein, wenn ich HMACSHA512 verwende?
TL; DR: Verwenden Sie HMAC-SHA512 für optimale Geschwindigkeit, Sicherheit und OK-Kompatibilität. SHA-256 ist auch sehr sicher und könnte bei CPUs mit 32-Bit-Operationen nützlich sein.
Um die Stärke der Hash-Methoden selbst zu sehen, werfen Sie bitte einen Blick auf die keylength.com Website . Sie werden sehen, dass sogar SHA-256 eine recht große Sicherheitsmarge hat.
Außerdem ignoriert der HMAC-Algorithmus Attacken auf den zugrunde liegenden Hash-Algorithmus. HMAC ist unempfindlich gegen das Geburtstagsproblem, das die Schlüsselstärke auf die Hälfte der Hash-Ausgabe halbiert. Es trifft nicht einfach zu, weil der Gegner den geheimen Schlüssel nicht hält und daher nicht versuchen kann, Kollisionen zu erzeugen. Deshalb ist HMAC-SHA1 auch ziemlich sicher.
Die Geschwindigkeit des Hash hängt jetzt von der Ausführungsumgebung ab. Aber im Allgemeinen können Sie die folgenden Annahmen treffen:
Verwenden Sie SHA-1, wenn Sie Kompatibilitätsprobleme erwarten. Andernfalls können Sie auch SHA-512 verwenden (und das Ergebnis auf eine vernünftige Anzahl von Bits reduzieren). Der interne Zustand und höhere Sicherheit von SHA-512 kann ein leichter Vorteil sein. Ich bin auf Probleme mit Kunden gestoßen, die keine Form von SHA-1 wegen allgemeiner Probleme mit dem Algorithmus annehmen; mit anderen Worten, die Tatsache, dass es allgemein nicht sicher ist, kann die Akzeptanz behindern.
Beachten Sie, dass SHA-384 und die weniger bekannten Hash-Methoden SHA-512/256 und SHA-512/224 eine spezielle Form von SHA-512 sind, die auf 384, 256 und 224 Bit abgeschnitten sind. Die Geschwindigkeit dieser Algorithmen ist also identisch. Der einzige Unterschied zur Ausgabegröße besteht darin, dass diese Sonderformen intern unterschiedliche Initialwerte verwenden. Ansonsten ist SHA-512 auf 384 Bit geschnitten so sicher und so schnell wie SHA-512/384. Sie sollten SHA-384 jedoch verwenden, um kompatibel zu bleiben - wenn Sie diese bestimmte Ausgabegröße benötigen.
Die Größe des Eingabeschlüssels hängt nicht von der zugrunde liegenden Hash-Funktion ab. Der Schlüssel wird zuerst XOR-maskiert und dann von der zugrundeliegenden Hash-Funktion gehasht; Hash-Algorithmen können praktisch unbegrenzte Datenmengen als Eingabe annehmen.
Es empfiehlt sich, eine Schlüsselgröße zu verwenden, die mindestens der Größe der verwendeten Hash-Methode entspricht. Andernfalls können Sie die Sicherheitsmarge der HMAC-Methode verringern. Es kann eine geringfügige Leistungseinbuße geben, wenn die Schlüsselgröße den Hashalgorithmus zum Hashing mehrerer Blöcke zwingt.
Sie könnten auch den (kommenden) SHA-3-Standard in dem Sinne verwenden, dass er sicher ist. HMAC-SHA-3 macht derzeit allerdings nicht viel Sinn. HMAC ist eigentlich Overkill für SHA-3 (Keccak); SHA-3 sollte auch ohne das HMAC-Konstrukt sicher sein. [Bearbeiten] Inzwischen wurde KMAC als MAC-Konstrukt für SHA-3 standardisiert.
Außerdem haben die SHA-2-Konstrukte - etwas überraschend - während des SHA-3-Wettbewerbs eine ziemlich gute Resistenz gegen Kryptanalyse gezeigt. Es besteht also keine dringende Notwendigkeit, auf SHA-3 zu aktualisieren.
Ich glaube nicht, dass Sie sich um Sicherheitsvorteile sorgen müssen, HmacSha1 wird immer noch als sicher angesehen Sicherheit sollte als relativ zur Schlüssellänge gedacht werden. Sha256 vs Sha512 Leistung hängt von der Implementierung, Plattform usw. ab, Sie müssen sich selbst testen. Und die Schlüssellängen, die Sie HMAC zur Verfügung stellen, sind unabhängig vom Hash-Algorithmus, siehe pseudocode .
HMAC ruft den Hash-Algorithmus zwei Mal auf, während SHA3 keine HMAC-Konstruktion für getastetes Hashing benötigt, so dass ein doppelter Aufruf leicht vermieden werden kann. Als Ergebnis schlägt SHA3 HMAC-SHA2 in der Leistung und HMAC-SHA1 in der Sicherheit (das Beste aus beiden Welten).
Tags und Links c# security cryptography hmac