Güncelleme:
Bu bağlantıyı ASP.NET Web API için JWT kimlik doğrulamasını JWT ile ilgilenen herkes için nasıl kullanacağımı diğer yanıma ekledim .
Web API'sını güvenli hale getirmek için HMAC kimlik doğrulamasını uygulamayı başardık ve sorunsuz çalıştı. HMAC kimlik doğrulaması, her tüketici için hem tüketici hem de sunucunun hmac karma mesajını bildikleri gizli bir anahtar kullanır, HMAC256 kullanılmalıdır. Çoğu durumda, tüketicinin karma şifresi gizli bir anahtar olarak kullanılır.
İleti normalde HTTP isteğindeki verilerden veya HTTP başlığına eklenen özelleştirilmiş verilerden oluşturulur, ileti şunları içerebilir:
- Zaman damgası: isteğin gönderildiği zaman (UTC veya GMT)
- HTTP fiili: GET, POST, PUT, DELETE.
- veri ve sorgu dizesi yayınlamak,
- URL
Gelişmiş, HMAC kimlik doğrulaması:
Tüketici, HTTP isteğinin şablonu olan imzayı (hmac karma çıktısı) oluşturduktan sonra web sunucusuna bir HTTP isteği gönderir:
User-Agent: {agent}
Host: {host}
Timestamp: {timestamp}
Authentication: {username}:{signature}
GET talebi için örnek:
GET /webapi.hmac/api/values
User-Agent: Fiddler
Host: localhost
Timestamp: Thursday, August 02, 2012 3:30:32 PM
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
İmza almak için karma mesaj:
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
Sorgu dizeli POST isteği örneği (aşağıdaki imza doğru değil, sadece bir örnek)
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
İmza almak için karma mesaj
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3
Form verilerinin ve sorgu dizesinin sırayla olması gerektiğini lütfen unutmayın, böylece sunucudaki kod doğru iletiyi oluşturmak için sorgu dizesini ve form verilerini alır.
HTTP isteği sunucuya geldiğinde, bilgi alma isteğini ayrıştırmak için bir kimlik doğrulama eylem filtresi uygulanır: HTTP fiil, zaman damgası, uri, form verileri ve sorgu dizesi, daha sonra bunları sır ile imza oluşturmak (hmac hash kullanın) anahtarı (karma parola) girin.
Gizli anahtar, istek üzerine kullanıcı adı ile veritabanından alınır.
Daha sonra sunucu kodu, istek üzerine imza ile oluşturulan imzayı karşılaştırır; eşitse, kimlik doğrulaması geçilir, aksi takdirde başarısız olur.
İmza oluşturmak için kod:
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;
}
Peki, tekrar saldırısı nasıl önlenir?
Zaman damgası için kısıtlama ekleyin:
servertime - X minutes|seconds <= timestamp <= servertime + X minutes|seconds
(servertime: sunucuya gelen istek zamanı)
Ve isteğin imzasını bellekte önbelleğe alın (MemoryCache kullanın, zaman sınırında kalmalıdır). Bir sonraki istek, önceki istekle aynı imzayla gelirse, reddedilir.
Demo kodu şu şekildedir:
https://github.com/cuongle/Hmac.WebApi