Zabezpieczanie interfejsu API: podstawowe uwierzytelnianie SSL i HTTP vs podpis

Podczas projektowania API dla naszej aplikacji internetowej, użyjemy ich subdomeny jako "nazwy użytkownika"i wygenerujemy klucz API/wspólny sekret. Po pierwsze, Czy Można używać subdomeny jako nazwy użytkownika? Nie widzę korzyści z wygenerowania kolejnego klucza.

Różne API wydają się robić jedną z dwóch rzeczy:

  1. Użyj podstawowego uwierzytelniania HTTP z SSL

W każdym żądaniu nazwa użytkownika jest ustawiana na subdomenę i hasło do klucza API. Ponieważ używamy SSL to powinno być bezpieczne przed spoofingiem.

Godne Uwagi API: Google Checkout, Freshbooks, GitHub, Zendesk

  1. Utwórz podpis żądania z udostępnionym sekretem

Zwykle uzyskuje się poprzez uporządkowanie par klucz / wartość i użycie HMAC-SHA1 z dzielonym sekretem do wygenerowania podpisu. Podpis jest następnie wysyłany wraz z żądaniem i weryfikowany na drugim końcu.

Godne Uwagi API: Google Checkout, Amazon AWS

PS: To nie pomyłka, Google Checkout obsługuje zarówno

Edit: wystarczy przeczytać, że OAuth 2 zrzuca podpisy na rzecz wysłania nazwy użytkownika/hasła przez SSL.

Jakieś opinie od kogokolwiek na temat tego co wybrać: SSL vs Signature?

Author: Annika Backstrom, 2011-04-01

6 answers

Podstawowe uwierzytelnianie HTTP przez SSL jest całkowicie bezpieczne z moich badań.

W końcu użycie SSL (teraz ściśle TLS) oznacza, że warstwa transportowa jest szyfrowana i możemy bezpiecznie założyć, że wszelkie przekazywane informacje są bezpieczne i nie zostały zmienione.

Dlatego podanie nazwy użytkownika i hasła bez generowania podpisu jest wystarczające.

 38
Author: Marcus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 10:18:11

Odpowiedź Igora nie jest do końca prawdziwa. Chociaż TLS zapewnia, że warstwa transportowa jest szyfrowana i bezpieczna, nadal nie jest tak bezpieczna jak na przykład przy użyciu TLS z wzajemnym uwierzytelnianiem, gdzie klient uwierzytelnia się za pomocą "silnej kryptografii" w formie podpisu cyfrowego. Istnieją dwa główne powody, dla których jest to nadal lepsze niż podstawowe uwierzytelnianie przez TLS:

  • Hasła to hasła i zakładam, że trzy z 7 miliardów ludzi na naszej planecie używa 30-znakowe hasło, które jest całkowicie losowe. Reszta z nas wybrała coś o dużo mniejszej entropii. Dlatego o wiele łatwiej jest atakującemu zmusić usługę, która używa haseł zamiast podpisów cyfrowych.

  • Można by argumentować, że w przypadku podpisów cyfrowych po stronie klienta istnieje również hasło, które zwykle służy do uzyskania dostępu do klucza prywatnego. Ale nadal jest to sytuacja znacznie inna niż ta, którą mamy Z Basic Auth: najpierw klucz prywatny znajduje się jako zasób na komputerze klienta, więc nawet jeśli zostanie odzyskany, wpłynie tylko na jedną osobę, a nie na wszystkich, a po drugie, dla typowych formatów kontenerów kluczy, takich jak PKCS#12, istnieje również szyfrowanie oparte na hasłach używane do uzyskania dostępu do klucza. Algorytmy te zostały specjalnie zaprojektowane, aby spowolnić atakujących, aby zmniejszyć ich szybkość prób brute-force na jednostkę czasu, co ponownie jest zaletą dla podpisów cyfrowych.

Nie ma wątpliwości, że TLS Basic Auth jest znacznie wygodniejszy aby skonfigurować i używać, ale w środowiskach o wysokim poziomie bezpieczeństwa zawsze wolałbym "silną kryptografię" niż rozwiązania użytkownika/hasła, warto się trudzić.

 34
Author: emboss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 15:33:59

Można używać subdomeny jako nazwy użytkownika, o ile istnieje jakaś forma tajemnicy.

Korzyść z używania współdzielonej tajemnicy polega na tym, że "strona" wykonująca żądanie nie musi znać tajemnicy, tylko musi znać podpis, aby wykonać żądanie. Jest to korzystne, jeśli chcesz, aby użytkownicy zezwalali na składanie żądań za pośrednictwem przeglądarki, na przykład.

Za pomocą S3 możesz utworzyć podpis, wysłać go do przeglądarki i zrobić bezpośrednie przesyłanie z przeglądarki do S3.

Możesz również użyć http Digest, który ma korzyści z obu. Nadal można łatwo przetestować API w przeglądarce, ponieważ przeglądarki obsługują Digest i Basic,a hasło tekstowe nigdy nie jest wysyłane przez przewód.

 3
Author: Evert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 09:55:43

Problem Heartbleed z OpenSSL ilustruje potencjalne pułapki polegania wyłącznie na SSL do zabezpieczania API. W zależności od zastosowania API i konsekwencji, jeśli transport SSL został naruszony, może być konieczne podjęcie dodatkowych środków bezpieczeństwa, jak wspomniano w odpowiedzi Emboss.

 3
Author: Matt H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-02 18:39:52

Odpowiadam na stary wątek, bo nikt tak naprawdę nie poruszył głównego punktu

SSL / TLS jest zasadniczo wadliwe jak wszystkie PKI, ponieważ polegają na łańcuchu zaufania, który okazał się coraz bardziej podatny na ataki mim {6]}:

  • Organy certyfikacyjne zostały i mogą zostać zhakowane. Jednym z przykładów wśród wielu jest przypadek DigiNotar , w którym CA był zagrożony przez miesiące, zanim naruszenie zostało uznane za unieważnione wszystkie certyfikaty. W tymczasem irański rząd sfałszował nice doskonale ważne certyfikaty SSL dla google.com, facebook.com, twitter.com etc

  • Firmowe narzędzia filtrujące proxy, takie jak Zscaler, które odszyfrowują i ponownie szyfrują cały ruch w locie dla nieokreślonych "celów bezpieczeństwa". Zobacz to pytanie/odpowiedź na SO

  • Błędy z najczęstszą implementacją SSL (openSSL) są wykrywane cały czas (ale z czasem powinno być lepiej? )

Stąd wielcy gracze nie lubią polegać tylko na SSL:

W takich przypadkach token HMAC nie daje Ci poufności , ale nie pozwoli, aby ktokolwiek cię szpieguje, sfałszował żądania z Twoimi poświadczeniami , co byłoby trywialne, gdybyś przekazał je za pomocą podstawowego auth.

Alternatywą dla modelu PKI jest Web of trust , który nie opiera się na jednym autorytecie do weryfikacji autentyczności certyfikatów, ale raczej na Opinia wydana przez większość - znanych i zaufanych rówieśników lub - znani, ale niekoniecznie zaufani rówieśnicy

Ten model nie jest nadal doskonały, ponieważ podlega notorycznemu atakowi 51% ([39]}, dokładnie tak samo jak w przypadku Blockchain Bitcoin (jest to przykład zaufanego modelu rozproszonego)
 2
Author: Stefano Fratini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:04

Chciałbym zwrócić uwagę na kilka rzeczy wymienionych na security.stackexchange.com ponieważ mówisz " podstawowe uwierzytelnianie HTTP przez SSL jest całkowicie bezpieczne z moich badań.". Można argumentować, że punkty 3 i 4 poniżej rzadko są ważne dla interfejsów API REST, ale tak naprawdę zależy to od tego, jak zostaną zaimplementowane.

" jest kilka problemów z HTTP Basic Auth:

  • hasło jest wysyłane przez przewód w kodowaniu base64 (co może być łatwo przekonwertowane na zwykły tekst).
  • hasło jest wysyłane wielokrotnie, dla każdego żądania. (Większy atak okno)
  • hasło jest buforowane przez webbrowser, co najmniej dla długość okna / procesu. (Może być po cichu ponownie użyty przez dowolne inne żądanie do serwera, np. CSRF).
  • Hasło może być zapisane na stałe w przeglądarce, jeśli użytkownik]} prośby. (Podobnie jak w poprzednim punkcie, dodatkowo może zostać skradziony przez
    innego użytkownika na współdzielonej maszynie).

Z tych, używanie SSL rozwiązuje tylko pierwsze. I nawet z to, SSL chroni tylko do serwera www - wszelkie wewnętrzne routing, logowanie serwera, itp, będzie zobaczyć hasło tekstowe.

Tak jak w przypadku wszystkiego, co jest ważne, aby spojrzeć na cały obraz. Czy HTTPS chroni hasło podczas przesyłania? - Tak.

Czy to wystarczy? Zazwyczaj nie. (Chcę powiedzieć, że zawsze nie - ale to naprawdę zależy od tego, jaka jest Twoja strona i jak bezpieczna musi być.)"

 1
Author: Ogglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 14:50:26