Jeśli Twój host na to pozwala lub będziesz musiał radzić sobie z poufnymi danymi, użyj HTTPS, kropka. (Często jest to wymagane przez prawo).
W przeciwnym razie, jeśli chcesz zrobić coś przez HTTP. Zrobiłbym coś takiego.
- Serwer osadza swój klucz publiczny na stronie logowania.
- Klient wypełnia formularz logowania i klika Prześlij.
- Żądanie AJAX pobiera aktualny znacznik czasu z serwera.
- Skrypt po stronie klienta łączy poświadczenia, znacznik czasu i sól (zaszyfrowaną z danych analogowych, np. Ruchy myszy, zdarzenia związane z naciśnięciem klawisza), szyfruje je przy użyciu klucza publicznego.
- Przesyła wynikowy skrót.
- Serwer odszyfrowuje skrót
- Sprawdza, czy sygnatura czasowa jest wystarczająco aktualna (zezwala tylko na krótkie 5-10 sekundowe okno). Odrzuca logowanie, jeśli sygnatura czasowa jest zbyt stara.
- Przechowuje hash przez 20 sekund. Odrzuca ten sam skrót do logowania w tym okresie.
- Uwierzytelnia użytkownika.
W ten sposób hasło jest chronione i ten sam skrót uwierzytelniania nie może zostać odtworzony.
O bezpieczeństwie tokena sesji. To trochę trudniejsze. Możliwe jest jednak nieco utrudnienie ponownego wykorzystania skradzionego tokena sesji.
- Serwer ustawia dodatkowy plik cookie sesji, który zawiera losowy ciąg.
- Przeglądarka odsyła ten plik cookie przy następnym żądaniu.
- Serwer sprawdza wartość w pliku cookie, jeśli jest inna, niszczy sesję, w przeciwnym razie wszystko jest w porządku.
- Serwer ponownie ustawia plik cookie z innym tekstem.
Jeśli więc token sesji zostanie skradziony, a żądanie zostanie wysłane przez kogoś innego, to przy następnym żądaniu pierwotnego użytkownika sesja zostanie zniszczona. Jeśli więc użytkownik aktywnie przegląda witrynę, często klikając w linki, to złodziej nie zajdzie daleko ze skradzionym tokenem. Ten schemat można wzmocnić, wymagając innego uwierzytelnienia dla wrażliwych operacji (takich jak usunięcie konta).
EDYCJA: Należy pamiętać, że nie zapobiega to atakom MITM, jeśli osoba atakująca utworzy własną stronę z innym kluczem publicznym i żądaniami serwerów proxy do serwera. Aby się przed tym zabezpieczyć, klucz publiczny musi być przypięty do lokalnej pamięci przeglądarki lub w aplikacji, aby wykryć tego rodzaju sztuczki.
O implementacji: RSA jest prawdopodobnie najbardziej znanym algorytmem, ale jest dość powolny dla długich kluczy. Nie wiem, jak szybka byłaby implementacja PHP lub Javascript. Ale prawdopodobnie istnieją szybsze algorytmy.