Web barındırıcınız izin veriyorsa veya hassas verilerle uğraşmanız gerekecek, o zaman HTTPS'yi kullanın. (Genellikle afaik yasa gereği).
Aksi takdirde, HTTP üzerinden bir şey yapmak istiyorsanız. Böyle bir şey yapardım.
- Sunucu, genel anahtarını oturum açma sayfasına yerleştirir.
- Müşteri, giriş formunu doldurur ve gönder düğmesine tıklar.
- AJAX isteği, sunucudan geçerli zaman damgasını alır.
- İstemci tarafı komut dosyası, kimlik bilgilerini, zaman damgasını ve bir tuzu birleştirir (analog verilerden karma hale getirilir, örn. Fare hareketleri, tuşa basma olayları), açık anahtarı kullanarak şifreler.
- Ortaya çıkan hash'i gönderir.
- Sunucu karmanın şifresini çözer
- Zaman damgasının yeterince güncel olup olmadığını kontrol eder (yalnızca 5-10 saniyelik kısa bir pencereye izin verir). Zaman damgası çok eskiyse oturumu reddeder.
- Hash'i 20 saniye saklar. Bu aralıkta oturum açma için aynı karmayı reddeder.
- Kullanıcının kimliğini doğrular.
Bu şekilde parola korunur ve aynı kimlik doğrulama hashı tekrar oynatılamaz.
Oturum jetonunun güvenliği hakkında. Bu biraz daha zor. Ancak çalınan bir oturum jetonunu yeniden kullanmayı biraz daha zor hale getirmek mümkündür.
- Sunucu, rastgele bir dizge içeren fazladan bir oturum tanımlama bilgisi ayarlar.
- Tarayıcı, bir sonraki talepte bu çerezi geri gönderir.
- Sunucu tanımlama bilgisindeki değeri kontrol eder, eğer farklıysa, oturumu yok eder, aksi takdirde her şey yolundadır.
- Sunucu, çerezi farklı bir metinle yeniden ayarlar.
Dolayısıyla, oturum jetonu çalınırsa ve başka biri tarafından bir istek gönderilirse, orijinal kullanıcının bir sonraki isteğinde oturum yok edilir. Dolayısıyla, kullanıcı siteye aktif olarak göz atıyorsa, bağlantılara sık sık tıklarsa, hırsız çalınan jetonla fazla ileri gitmez. Bu şema, hassas işlemler için (hesap silme gibi) başka bir kimlik doğrulaması gerektirerek güçlendirilebilir.
DÜZENLEME: Saldırganın kendi sayfasını farklı bir genel anahtarla kurması ve sunucuya proxy istekleri yapması durumunda, bunun MITM saldırılarını engellemediğini lütfen unutmayın. Buna karşı korunmak için genel anahtar, tarayıcının yerel depolama alanına veya bu tür hileleri algılamak için uygulama içine sabitlenmelidir.
Uygulama hakkında: RSA muhtemelen en bilinen algoritmadır, ancak uzun anahtarlar için oldukça yavaştır. Bir PHP veya Javascript uygulamasının ne kadar hızlı olacağını bilmiyorum. Ama muhtemelen daha hızlı algoritmalar var.