Rozwiązanie trzecie - wprowadzamy klucz sesji
bilet=[id użytkownika, id usługi, adres sieciowy, stempel czasowy, czas życia biletu, klucz sesji]#hasło usługi
poświadczenie=[identyfikator użytkownika, stempel czasowy, adres sieciowy]#klucz sesji
Opis rozwiązania:
- Użytkownik wysyła serwerowi uwierzytelniającemu swój identyfikator
i nazwę serwera z którego chce skorzystać.
- Serwer uwierzytelniający tworzy bilet =[identyfikator użytkownika,
identyfikator usługi adres sieciowy, stempel czasowy, czas życia biletu,
klucz sesji ]#hasło usługi, wraz z kluczem sesji koduje go hasłem
użytkownika i wysyła użytkownikowi.
- Użytkownik znając hasło dekoduje przesyłkę i otrzymuje bilet oraz
klucz sesji.
- Za każdym razem kiedy użytkownik chce potwierdzić swoją autentyczość
przed serwerem generuje poświadczenie=[identyfikator użytkownika, stempel
czasowy, adres sieciowy]#klucz sesji i wysyła je wraz z biletem do serwera.
- Serwer znając swoje hasło dekoduje bilet, sprawdza jego poprawności
i z biletu wyciąga klucz sesji. Za pomocą klucza sesji dekoduje poświadczenie
i na tej podstawie sprawdza autentyczność użytkownika.
Powyższy mechanizm łatwo można rozszerzyć tak żeby użytkownik miał możliwość
sprawdzenia autentyczności serwera ( zabezpieczenie przed atakiem wykorzystującym
fałszywy serwer ). Wystarczy że po wysłaniu serwerowi biletu i poświadczenia
użytkownik zarząda żeby serwer sam wysłał mu potwierdzenie. Jeśli serwer nie będzie prawdziwym serwerem nie
będzie potrafił wygenerować poświadczenia.
Problemy
Użytkownik chcąc otrzymać bilet i klucz sesji do różnych usług za każdym
razem musi podawać od nowa hasło. Jeśli będzie chciał skorzystać z kilku usług będzie musiał kilka razy podać hasło. Chcielibyśmy żeby hasło
podawane było tylko raz w trakcie sesji. Jak zrobić to nie pamiętając hasła ?