Ben hem üretecek hem de tüketeceğim bir REST hizmeti için bir API çalışıyorum. Geçtiğimiz birkaç günü kimlik doğrulamanın nasıl güzel bir şekilde ele alınacağını anlamaya çalıştım ve sonunda bir şey bulduğumu düşünüyorum.
Ben uygulama yığını hakkında aşağıdaki gerçeklere dayanarak bu geliyorum:
- İstemci ve Sunucu .NET4'te (İstemci Profilindeki istemci bölümü)
- Sunucu, WCF REST kullanarak sunar
- Uygulamada kullanıcı adını ve şifreyi gerçekten bellekte tutmak istemiyorum
3'ten, kimlik doğrulama sunucusu tarafından doğrulandıktan sonra, istemci uygulamanın geri kalanında kullanmak üzere bir jeton alır (bu, örneğin başka şeyler yapmama izin verir) kullanıcıları zaman aşımına uğratmak, kullanıcıları web ve masaüstü sürümleri arasında sorunsuz bir şekilde taşımak vb. Aramaların tekrar oynatılmasını ve kurcalamaya karşı nasıl dayanıklı hale getirileceğini anladıktan sonra, aşağıdakileri buldum:
- İstemci kimlik doğrulaması yapmaya çalışmadan önce,
ECDiffieHellmanCng
sınıfı kullanarak bir Diffie-Hellman anahtar çifti oluşturur . - Anahtar çiftinin ortak kısmını kullanıcı adı ve parola ile birlikte tel üzerinden gönderir (elbette HTTPS üzerinden).
- Sunucu, kullanıcı adı / parola kombinasyonunun kimliğini doğrular, başarılı olursa aşağıdakileri yapar:
- Benzersiz bir oturum jetonu oluşturur
- Kendi DH anahtar çiftini oluşturur ve istemci tarafından sağlanan ortak anahtardan paylaşılan sırrı hesaplar
- Oturum jetonunu, paylaşılan sırrı, kullanıcıyı ve veritabanındaki "son işlem" zamanını (yuvarlanan süre sonu penceresi için kullanılır) not eder
- Oturum belirtecini, genel DH anahtarını ve bir kimlik doğrulama başarılı iletisini döndürür
- İstemci DH anahtarını yanıttan alır, paylaşılan sırrı hesaplar ve hem jetonu hem de sırrı bellekte saklar.
Bu andan itibaren, oturum belirteci / gizli birleşimi, diğer parmakların çoğu REST API'leri gibi çalışır, istek parmak izi bırakılır ve zaman damgası eklenir ve ardından bir tür HMAC oluşturulur. İstemci sunucuya karşı bir eylem gerçekleştirdiğinde, belirteç / gizli çiftini kontrol eder ve geçerli ve süresi dolmamışsa eyleme izin verir ve oturumdaki son eylem kaydını günceller.
Açık bir kusur görmüyorum ve muhtemelen bunun için aşırı tasarlanmış, ancak bunu bir noktada nasıl yapacağımı öğrenmem gerekiyor. HMAC tekrar saldırılarını önler, DH anlaşması MITM saldırılarını önlemeye yardımcı olur (HMAC / DH arasında başımın üstünden uygulanabilir bir saldırı düşünemiyorum).
Herkes bu poke delik var mı?