2013-07-10 5 views
6

Ich bin auf der Suche nach HMACSHA256 Request Unterzeichnung in einer API, die ich erstelle. Aus dem, was ich aus https://tools.ietf.org/html/rfc4868 verstehe, ist es am besten, dass der geheime Schlüssel die gleiche Anzahl von Bits wie der Hash-Algorithmus ist (d. H. SHA256-Geheimschlüssel sollten 256 Bits/32 Bytes sein).Generieren Sie einen starken HMACSHA256-Schlüssel in C#

Kann ich einen der vielen verschiedenen Zufallszahlengeneratoren für C# verwenden oder gibt es eine spezielle Möglichkeit, diese Schlüssel zu generieren.

Schließlich verwendet Amazon Web Services HMACSHA256, aber die geheimen Schlüssel, die sie (zumindest für mich) bereitstellen, sind 320 Bits/40 Bytes (wenn der Schlüssel mit UTF-8 in Bytes konvertiert wird, siehe https://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232). Gibt es einen Grund, mehr zu verwenden, als vom Hashing-Algorithmus benötigt wird, da er abgeschnitten ist?

Antwort

5

Wenn eine Taste länger ist als der HMAC unterstützt, es wird in der Regel auf die richtige Größe gehasht werden. Dies dient hauptsächlich dazu, von Menschen lesbare Schlüssel beliebiger Länge zu unterstützen. Wenn Sie einen Schlüssel programmatisch generieren und ihn nicht für Menschen lesbar benötigen, empfehle ich die Verwendung von RandomNumberGenerator. Dies ist im Grunde, wofür es gemacht wurde.

10

Eine Möglichkeit, ein (vermutlich sicheren) Schlüssel zu generieren ist:

var hmac = new HMACSHA256(); 
var key = Convert.ToBase64String(hmac.Key); 
+1

Base64 ist nicht das gleiche wie Hex, IE Ihr Variablenname ist irreführend. – Peter

+1

@Peter, danke, dass ich darauf hingewiesen habe, ich habe den Variablennamen geändert. – Omar

Verwandte Themen