Pracujemy nad nowym projektem, jesteśmy dwoma głównymi programistami i znaleźliśmy się na rozdrożu, jak używać tokena do zabezpieczenia komunikacji między serwerem a klientem.
Pierwsza sugestia: (Jednorazowy token AKA Static Token)
klient żąda tokena podstawowego, wysyłając nazwę użytkownika i hasło oraz bieżący czas (ta zmienna zostanie zapisana w bazie danych serwera i po stronie klienta) do interfejsu API, serwer interpretuje dane wejściowe i wyświetla token z hashowaniem (np .: 58f52c075aca5d3e07869598c4d66648) zapisuje go w bazie danych i zwraca do klienta.
Klient zapisuje teraz token podstawowy i tworzy nowy token hashowany za pomocą tokena podstawowego + zmiennej current_time wysłanej w żądaniu uwierzytelnienia (pozwala wywołać ten nowy token, main_token) również serwer robi to samo i tworzy ten sam token przy użyciu tego samego algorytmu .
Za każdym razem, gdy klient wysyła zapytanie do interfejsu API serwera, wysyła główny_token do serwera, teraz serwer porównuje wygenerowany w nim token, z głównym_tokenem wysłanym przez klienta, jeśli jest zgodny, oznacza to, że użytkownik jest prawdziwy
Druga sugestia: (token dynamiczny)
Klient generuje dwa losowe klucze ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) Na każde żądanie w interfejsie API klient tworzy skrót za pomocą typu zapytania, a dwa klucze z złożony algorytm i wysyła te dwa klucze + skrót do serwera
Serwer, używając tego samego algorytmu używanego w kliencie, tworzy skrót i porównuje go z tym wysłanym przez klienta, jeśli jest zgodny, serwer kontynuuje przetwarzanie zapytania
Pytanie brzmi: który z nich jest najbardziej logicznym i bezpiecznym sposobem zabezpieczenia żądań API?
Odpowiedzi:
Ogólnie podoba mi się pierwsze podejście.
Jednej rzeczy, o której nie wspominam o pierwszej, o której powinieneś pamiętać, znacznik czasu użyty do zaszyfrowania tokena musi mieć upływ czasu TTL, który jest niezwykle krótki (jak 1 sekunda), abyś mógł sprawdzić, czy wiadomość nie została wysłana z ten sam znacznik czasu i token z wiadomości 12 godzin wcześniej; oczywiście byłoby to skalkulowane jako zgodne z prawem, ale tak nie jest w tym przypadku.
Jeśli są to jedyne dwie opcje, które rozważasz, chciałbym tylko upewnić się, że spojrzałeś na inne podejścia, ponieważ jest ich wiele. Więcej niż zamierzam wymienić. Są to niektóre typowe metody uwierzytelniania, które warto zbadać, aby sprawdzić, czy mogą lepiej pasować do twojego celu, i jeśli nic innego ich zrozumienie może nie dać ci pomysłów, które pomogą ci ulepszyć dowolne podejście.
Pamiętaj, że nie jestem ekspertem od bezpieczeństwa.
OAuth / Federated
W tym podejściu masz zewnętrznego poręczyciela, w którym konsumujący kod żąda tokena / certyfikatu / co masz od nich i przekazuje ci to, w tym momencie wszystko, co musisz zrobić, to zapytać trzecią stronę, czy klucz, który został ci przekazany, to legit.
Zawodowiec:
Kon:
Certyfikaty asynchroniczne
W tym miejscu klienci mieliby szyfrować swoją komunikację za pomocą publicznego certyfikatu, który udostępniono im podczas tworzenia użytkownika. Po swojej stronie odszyfrujesz przy użyciu klucza prywatnego powiązanego z użytkownikiem. Zasadniczo inicjowałbyś komunikację z odpowiedzią na wyzwanie, aby pokazać, że mogą szyfrować / deszyfrować, tak jak oczekujesz, że zidentyfikujesz ich jako tych, za których się podają. Chociaż możliwe są podejścia „synchroniczne”, które nie wykorzystują odpowiedzi na wyzwanie, mają nieco mniejsze bezpieczeństwo i pewne problemy z synchronizacją czasu, co może sprawić, że będą trudniejsze.
od Novell (tak, wiem, Novell ? naprawdę?)
Zawodowiec:
Kon:
NTLM
Nie śmiej się, jeśli jest to usługa mniejsza lub przeznaczona tylko dla użytkowników wewnętrznych, a działasz w środowisku Windows, nie ma nic złego w korzystaniu ze standardowego uwierzytelniania NTLM w celu zagwarantowania dostępu. Zwłaszcza jeśli pracujesz z IIS, jest to najprostsze podejście. Łatwy w utrzymaniu i konfiguracji również w pliku web.config.
Zawodowiec:
Kon:
Nonces
Podczas pracy z jednostkami nonces w podejściu uwierzytelniającym podajesz metodę uzyskania nonce w usłudze. Ta metoda zwraca unikalny dowolny ciąg lub fragment danych („nonce”) na każde żądanie. Każde żądanie do innych metod wymaga teraz pobrania nonce i użycia w algorytmie kryptograficznym dla żądania. Wartością jest to, że serwer śledzi używane jednostki i nigdy nie pozwala na ponowne użycie jednostki, co całkowicie zapobiega atakom powtórkowym, ponieważ po złożeniu żądania z jedną jednostką, żądanie z tą jednostką nigdy nie może zostać ponownie wykonane. W miarę żądania jednostek są dodawane do listy dostępnych jednostek, ponieważ są używane, przenoszone są z listy dostępnych na listę używanych.
Zawodowiec:
Kon:
źródło