2013-10-17 10 views
6

Wdrażam system uwierzytelniania API REST.Uwierzytelnianie API przy użyciu znacznika czasu: Co zrobić, gdy zmieni się ustawienie czasu klienta?

Ja w zasadzie za pomocą metody opisanej w tym miejscu:

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

Zasadniczo używa ciała żądanie utworzenia skrótu, wysyła je do serwera wraz z rzeczywistą żądanie, serwer odtwarza i porównuje go, a co nie ...

nie przeszkadza wyjaśniając szczegóły. Ważną częścią jest to, że używam znacznika czasu, aby zapobiec "powtórnym atakom".

Cytując ze strony, to wyjaśnia:

Porównaj znacznik czasu bieżącego serwera do znacznika czasu klient wysłał. Upewnij się, że różnica między tymi dwoma znacznikami czasu w akceptowalnym czasie (może to być 5-15 minut), aby zapobiec atakom powtórki.

Problem jestem stoi teraz jest to, że jeśli ustawienie zegara klienta jest modyfikowana, może to spowodować nieoczekiwane błędy uwierzytelniania API, ponieważ znacznik czasu waha się pomiędzy klientem a serwerem.

Czy nie da się tego obejść? Czy muszę zrezygnować z używania znacznika czasu?

Gorąco wdzięczny, jeśli ktoś może mi pomóc z rozwiązaniem tego problemu datownika, lub jakikolwiek inny sposób, który może zapobiec atakom przez powtórzenie.

Uwaga: Zdaję sobie sprawę, że wystawienie nonce do klienta jest doskonałym sposobem, aby zapobiec „atakom przez powtórzenie”, ale chcę, aby to moje ostateczności, ponieważ koszt realizacji tworząc nonce-issuing- API i backend do zarządzania nonce jest zbyt duży.

+1

Jeśli ustawienie zegara klienta jest modyfikowany mówiąc rzeczywiście zaistnieje niepowodzeń uwierzytelniania i nikt nie może pomoc z wyjątkiem klienta musi zbadać i zmienić ustawienia. Jest kilka rzeczy, o których naprawdę nie powinno się martwić. Również 5-15 min jest zbyt dużym dopuszczalnym limitem. Powinno to być + -60 sekund. Nie zatrzymuj swojego pomysłu wysyłania znacznika czasu tylko dla nieodpowiedzialnego klienta.Twoje pytanie jest jednak bardzo dobre. – Satish

+0

Witam, mam ten sam problem, rozwiązujesz go? Dziękuję –

Odpowiedz

2

Porównując sygnaturę czasową serwera z datownika klienta wysyłane, to nie musi być datownik klient, ale previuously datownik wysyłane przez serwer do klienta. Nigdy nie można polegać na sygnaturze czasowej klienta, ponieważ może to być cokolwiek lub może być na drugim końcu świata.

Gdy klient łączy się z serwerem po raz pierwszy, serwer może odpowiedzieć na znacznik czasu i zapisać go na kliencie, przy następnym wysłaniu przez klienta ostatniego odebranego znacznika czasu.

+0

Dzięki! Odbieranie znacznika czasu z serwera do klienta byłoby w rzeczywistości tym samym pomysłem, co odebranie "nonce" z serwera. Zgadzam się, że jest to bardzo obiecujące rozwiązanie. Ale, aby to zrobić, muszę iść i pobrać nowy znacznik czasu KAŻDEGO czasu chcę zrobić żądanie API. Naprawdę nie chcę otrzymywać żadnych dodatkowych żądań HTTP dla każdego żądania API, które wykonuję ... Proszę mnie poprawić, jeśli się mylę. – ashiina

+0

Nie potrzebujesz żadnych dodatkowych żądań HTTP. Na każde żądanie klienta serwer zwraca wraz z danymi znacznik czasu. Klient przechowuje ten znacznik czasu i przy następnym wysłaniu żądania dołącza tę informację jako dodatkowy parametr. –

0

Myślę, że chcesz, aby twój znacznik czasu był czasem UTC, jak wskazuje aktualny artykuł.

+0

Dzięki. Skomentowałem tę drugą osobę: przypuszczam, że dostaję "sekundy od epoki". Ale czy ta wartość nie ulegnie zmianie, jeśli klient (np. IPhone) zmieni ustawienia zegara urządzenia. Tak właśnie się teraz dzieje. Czy moje zrozumienie jest właściwe? – ashiina

0
+1

Dzięki. Zakładam, że dostaję "sekundy od epoki". Ale czy ta wartość nie ulegnie zmianie, jeśli klient (np. IPhone) zmieni ustawienia zegara urządzenia. Tak właśnie się teraz dzieje. Czy moje zrozumienie jest właściwe? – ashiina

+0

Nie sądzę, że tak, ale mogę się mylić. – Kristian

Powiązane problemy