Wdrażam usługę sieci Web REST, używając języka C#, który będzie hostowany na platformie Azure jako usługa w chmurze. Ponieważ jest to usługa REST, jest ona bezstanowa i dlatego nie ma plików cookie ani stanów sesji.Implementacja tokenu uwierzytelniania usługi REST Web Service
Dostęp do usługi internetowej można uzyskać tylko przez HTTPS (certyfikat dostarczany przez StartSSL.com).
Po zalogowaniu użytkownika do usługi otrzymają token zabezpieczający. Ten token zapewni uwierzytelnianie w przyszłej komunikacji.
Token będzie zawierać znacznik czasu, identyfikator użytkownika i adres IP klienta.
Cała komunikacja będzie się odbywała tylko przez HTTPS, więc nie przejmuję się przechwytywaniem tokena i jego użyciem w atakach powtórki; token i tak wygaśnie.
Jest to usługa publiczna, ale obawiam się, że ktoś mógł zarejestrować się w usłudze, zalogować się, a następnie zmodyfikować token, który otrzymuje, aby uzyskać dostęp do kont innych użytkowników.
Zastanawiam się, jak najlepiej zabezpieczyć zawartość tokena, a także sprawdzić, czy nie zostało naruszone.
Planuję wykonaniem poniższego zabezpieczyć Token:
klient pomyślnie loguje się do usługi, a usługa służy:
- Wygeneruj losową wartość hash i to z SHA256 1000 razy.
- Wygeneruj jednorazowy klucz sesji z klucza prywatnego + zakasowaną wartość losową.
- Skasuj klucz sesji z SHA256 1000 razy, a następnie użyj go do zaszyfrowania tokena
- Użyj klucza prywatnego, aby podpisać zaszyfrowany token za pomocą RSA.
- Wysyła zaszyfrowany token + podpis + zakasowaną losową wartość do klienta w niezaszyfrowanym pakiecie JSON.
Gdy klient dzwoni do usługi, wysyła zaszyfrowany token i podpis w niezaszyfrowanym pakiecie JSON do usługi. Usługa będzie
- Odtworzenie klucza sesyjnego z kluczem prywatnym + zaszyfrowany wartości losowej
- używać klucza prywatnego do weryfikacji podpisu
- użytku zaszyfrowany klucz sesji do odszyfrowania symbolicznego
- Sprawdzić, token nie upłynął
- dalej z żądaną operacją ...
ja naprawdę nie wiem nic o szyfrowaniu więc mam kilka pytań:
- Czy to wystarczy, czy jest to przesada?
- Przeczytałem, że aby wykryć sabotaż, powinienem dołączyć HMAC z tokenem. Ponieważ podpisuję się pod kluczem prywatnym, czy nadal potrzebuję HMAC?
- Czy powinienem używać Rijndael zamiast RSA?
- Jeśli preferuje się Rijndael, czy wygenerowany IV jest wymagany do odszyfrowania? np. czy mogę je wyrzucić, czy też muszę go wysłać zaszyfrowany token? na przykład Zaszyfrowany token + HMAC + IV + zakasował losową wartość.
Ponieważ cała komunikacja odbywa się za pośrednictwem protokołu HTTPS, niezaszyfrowany pakiet JSON nie jest tak naprawdę niezaszyfrowany, dopóki nie dotrze do klienta.
Również mogę chcieć ponownie wprowadzić usługę w PHP później, więc to wszystko musi być wykonalne również w PHP.
Dzięki za pomoc
Dzięki za to. Postanowiłem użyć Rijndael i HMAC, ale wciąż staram się o tym przekonać. Czy mogę użyć IV do wyprowadzenia klucza sesji z klucza głównego? Czy mogę również użyć tego samego klucza sesji dla HMAC lub czy muszę uzyskać nowy klucz z bieżącego klucza sesji? Jeśli potrzebuję nowego klucza do HMAC, czy mogę użyć obecnego IV do tego, czy potrzebuję również nowej wartości losowej? Na koniec wspomniałeś, że nie powinienem szyfrować sygnatury czasowej identyfikatorem użytkownika, skąd więc mogę stwierdzić, że token wygasł? ponieważ nie mogę zapisać rekordu sesji w bazie danych. Dzięki jeszcze raz. –
Świetne pytania. Zaktualizuję odpowiedź kilkoma dodatkowymi informacjami. –
Ok, rozumiem. Więc HMAC jest obliczany na podstawie niezaszyfrowanych danych, a następnie szyfrowany danymi? Czy muszę przechowywać HMAC na serwerze, aby móc go później porównać, czy mogę odszyfrować token, a następnie obliczyć HMAC z niezaszyfrowanych danych i porównać je z HMAC, który został zaszyfrowany danymi? –