Pytanie: Czy ta technika uwierzytelniania API jest łatwa do hakowania?Uwierzytelnianie interfejsu API i możliwość hackowania
apiKey = "123456789"
apiCallId = "1256341451"
apiSecret = "67d48e91ab2b7471d4be2a8c2e007d13"
sig = md5(apiKey + apiCallId + apiSecret) = 09c297a354219f173bfc49c2e203ce03
gdzie
apiKey
: niektóre unikalny identyfikator dla użytkownikaapiCallId
: unikatowy liczb całkowitych, które muszą być coraz większej wartości (np UNIX Time Stamp)apiSecret
: String znany tylko do użytkownika i nas - nie przekazano w adresie URLsig
: "Unhackable" podpis tej funkcji API - skrót MD5
Przykład wywołania API:
http://api.domain.com/?apiKey=123456789&apiCallId=1256341451&sig=09c297a354219f173bfc49c2e203ce03¶m1=x¶m2=y
Ten interfejs API nie wymaga sesję i nie jest przeznaczony do 3rd party do korzystania w imieniu użytkownika. Zamiast tego ma być używany przez samego użytkownika.
Bardzo podoba mi się prostota tego. Wymóg, aby apiCallId
był wyjątkowy i zawsze się zwiększał, oznacza ponowne użycie numeru sig
, więc czuję, że jest bezpieczny (chroniony przed atakami powtórki), ale nie jestem ekspertem.
Inne interfejsy API używają wszystkich parametrów GET posortowanych alfabetycznie podczas obliczania sig
, ale nie widzę powodu, dla którego jest to konieczne, jeśli uwzględni się apiCallId
.
Spróbuj zhakować to teraz, zanim zostanie wdrożone i zwolnione.
Cieszę się z wszelkich opinii, sugestii i edukacji bezpieczeństwa.
Niesamowita odpowiedź i uwielbiam szczegóły techniczne. "erickson" wskazał, że przechwytywanie (człowiek-w-środku) jest możliwe dzięki powyższym. Czy masz jakieś zalecenia, jak zapobiec tego typu atakom? Wydaje mi się, że wykracza to poza pierwotne pytanie. Czy używa go HTTPS (a nie HTTP)? –
Jeśli MAC obejmuje wszystkie dane, _ i_ nie ma drugiego zestawu danych wejściowych, który jest kanoniczny dla tego samego wejścia do MAC (jest to ważne, jak nauczył się Amazon), i zapewniasz, że nie ma możliwości wykonania powtórnych ataków (twój licznik schemat, prawidłowo wdrożony, wydaje się być w porządku), a twój MAC jest bezpieczny, wtedy powinieneś być bezpieczny przed MITM. Dzieje się tak dlatego, że atakujący nie ma opcji - może zmodyfikować wartość parametru lub API i spróbować go wysłać, ale nie będzie możliwości wygenerowania prawidłowej wartości adresu MAC, więc połączenie powinno zostać odrzucone. –
Założę się, że wymuszenie, że identyfikator połączenia jest zawsze zwiększany przez tabelę bazy danych. Po prostu uważaj, aby zaktualizować go tylko po zaakceptowaniu poprawnego mac. W przeciwnym razie dowolny przypadkowy atakujący mógłby wysłać apiKey = your_id i apiCallId = 9999999999999999 ... oraz wartość MAC śmieci i spowodować łatwą odmowę usługi. Na HTTPS: możesz go użyć, zrób to - po pierwsze, będzie chronić poufność wejść API (i odpowiedzi RPC), i po prostu generalnie znacznie utrudni wszelkie ataki na twój auth. –