Aktualisieren:
Ich habe diesen Link zu meiner anderen Antwort hinzugefügt, wie die JWT-Authentifizierung für die ASP.NET-Web-API hier für alle verwendet wird, die sich für JWT interessieren.
Wir haben es geschafft, die HMAC-Authentifizierung auf die sichere Web-API anzuwenden, und es hat einwandfrei funktioniert. Bei der HMAC-Authentifizierung wird für jeden Verbraucher ein geheimer Schlüssel verwendet, von dem sowohl der Verbraucher als auch der Server wissen, dass er eine Nachricht hasht. HMAC256 sollte verwendet werden. In den meisten Fällen wird das Hash-Passwort des Verbrauchers als geheimer Schlüssel verwendet.
Die Nachricht besteht normalerweise aus Daten in der HTTP-Anforderung oder sogar aus benutzerdefinierten Daten, die dem HTTP-Header hinzugefügt werden. Die Nachricht kann Folgendes enthalten:
- Zeitstempel: Zeit, zu der die Anforderung gesendet wird (UTC oder GMT)
- HTTP-Verb: GET, POST, PUT, DELETE.
- Postdaten und Abfragezeichenfolge,
- URL
Unter der Haube wäre die HMAC-Authentifizierung:
Der Verbraucher sendet eine HTTP-Anfrage an den Webserver, nachdem er die Signatur (Ausgabe des hmac-Hash), die Vorlage der HTTP-Anfrage, erstellt hat:
User-Agent: {agent}
Host: {host}
Timestamp: {timestamp}
Authentication: {username}:{signature}
Beispiel für eine GET-Anfrage:
GET /webapi.hmac/api/values
User-Agent: Fiddler
Host: localhost
Timestamp: Thursday, August 02, 2012 3:30:32 PM
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
Die Nachricht an Hash, um die Signatur zu erhalten:
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
Beispiel für eine POST-Anfrage mit Abfragezeichenfolge (Signatur unten ist nicht korrekt, nur ein Beispiel)
POST /webapi.hmac/api/values?key2=value2
User-Agent: Fiddler
Host: localhost
Content-Type: application/x-www-form-urlencoded
Timestamp: Thursday, August 02, 2012 3:30:32 PM
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
key1=value1&key3=value3
Die Nachricht an Hash, um die Signatur zu erhalten
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3
Bitte beachten Sie, dass Formulardaten und Abfragezeichenfolge in der richtigen Reihenfolge sein sollten, damit der Code auf dem Server Abfragezeichenfolgen und Formulardaten erhält, um die richtige Nachricht zu erstellen.
Wenn eine HTTP-Anforderung an den Server gesendet wird, wird ein Authentifizierungsaktionsfilter implementiert, um die Anforderung zum Abrufen von Informationen zu analysieren: HTTP-Verb, Zeitstempel, URL, Formulardaten und Abfragezeichenfolge, basierend auf diesen, um eine Signatur (Verwendung von hmac-Hash) mit dem Geheimnis zu erstellen Schlüssel (Hash-Passwort) auf dem Server.
Der geheime Schlüssel wird aus der Datenbank mit dem Benutzernamen auf der Anfrage abgerufen.
Anschließend vergleicht der Servercode die Signatur auf der Anforderung mit der erstellten Signatur. Wenn gleich, wird die Authentifizierung übergeben, andernfalls ist sie fehlgeschlagen.
Der Code zum Erstellen der Signatur:
private static string ComputeHash(string hashedPassword, string message)
{
var key = Encoding.UTF8.GetBytes(hashedPassword.ToUpper());
string hashString;
using (var hmac = new HMACSHA256(key))
{
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
hashString = Convert.ToBase64String(hash);
}
return hashString;
}
Wie kann man einen Wiederholungsangriff verhindern?
Fügen Sie eine Einschränkung für den Zeitstempel hinzu, z. B.:
servertime - X minutes|seconds <= timestamp <= servertime + X minutes|seconds
(Servertime: Zeitpunkt der Anforderung an den Server)
Und zwischenspeichern Sie die Signatur der Anforderung im Speicher (verwenden Sie MemoryCache, sollte im Zeitlimit bleiben). Wenn die nächste Anfrage dieselbe Signatur wie die vorherige Anfrage hat, wird sie abgelehnt.
Der Demo-Code lautet wie folgt:
https://github.com/cuongle/Hmac.WebApi