Korzystanie z HMAC-SHA1 do uwierzytelniania API - jak bezpiecznie przechowywać hasło klienta?

W RESTful API, które używa uwierzytelniania w stylu S3, klient API podpisuje żądanie swoim tajnym kluczem za pomocą HMAC-SHA1, więc tajny klucz nigdy nie jest przesyłany przez przewód. Następnie serwer uwierzytelnia klienta za pomocą tajnego klucza tego klienta, aby powtórzyć sam proces podpisu i porównać wynik z podpisem przesłanym przez Klienta.

To wszystko jest ładne i dobre, ale oznacza to, że serwer wymaga dostępu do zwykłego tekstu udostępnionego przez Klienta sekret. To stoi w obliczu wszystkich porad tam przed przechowywaniem haseł użytkowników w jasne wewnątrz bazy danych. Przechowywanie tylko hasha hasła nie wchodzi w grę z tego co wiem - bo wtedy nie mogę zweryfikować podpisu klienta.

Powinienem podkreślić, że moje API jest RESTful i dlatego powinno być bezpaństwowe: wolałbym unikać kroku logowania przed innymi wywołaniami API.

Jednym z opcjonalnych rozwiązań jest szyfrowanie wszystkich haseł użytkowników za pomocą klucza symetrycznego algorytm. Jednak serwer musiałby przechowywać klucz do tego szyfrowania w miejscu łatwo dostępnym , np. w kodzie źródłowym. Jest to lepsze niż nic, ale nie optymalne rozwiązanie (jak wspomniał @Rook w swojej odpowiedzi, narusza CWE-257).

Innym kierunkiem rozwiązania może być coś wokół sygnatur asymetrycznych, ale nie mogę wymyślić, jak zastosować to do HMAC i nie mogę znaleźć żadnych artykułów na ten temat.

Czy coś mi umyka? Wielu szanowanych dostawców wdrożyło tego rodzaju schemat uwierzytelniania - nie wszyscy mogą naruszać wspólne zasady bezpieczeństwa, prawda? Jeśli nie, czy są jakieś najlepsze praktyki, którymi możesz się podzielić?

Author: Elad, 2011-03-30

3 answers

To jest minus uwierzytelniania w stylu symmetric-key challenge-response - nie umieszczasz tajemnicy na kablu, ale musisz ją przechowywać na obu końcach. (HMAC są symetrycznymi systemami klucza).

Zauważ jednak, że nie jest to hasło - to wspólny sekret . Jest tu zasadnicza różnica - hasło jest zazwyczaj wybierane przez użytkownika, podczas gdy wspólny sekret jest generowany losowo i dostarczany użytkownikowi (często nazywane są "kluczami API", w tym kontekst).

Przechowywanie haseł w formacie odwracalnym jest złe, ponieważ jeśli baza danych jest zagrożona, atakujący uzyskali hasła, które mogły (i prawdopodobnie były) używane gdzie indziej. Z drugiej strony przechowywanie wspólnego sekretu nie jest takim problemem - sekret jest specyficzny dla Twojej usługi, więc wszyscy napastnicy zyskali możliwość zalogowania się do Twojej usługi.

Z drugiej strony jest możliwe posiadanie układu asymetrycznego, który nie musi przechowuj sekret po stronie serwera. Podstawową ideą jest to, że serwer zna klucz publiczny klienta i bieżący numer sekwencji wiadomości. Podczas wysyłania żądania API klient zwiększa numer sekwencji wiadomości i oblicza podpis na numerze sekwencji i parametrach żądania API, które serwer może zweryfikować za pomocą klucza publicznego. Serwer odrzuca wiadomość, jeśli zawiera stary numer sekwencji wiadomości, aby zapobiec atakom powtórek.

 34
Author: caf,
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-03-31 07:13:38

Najlepiej po zalogowaniu się użytkownika dać im kryptograficzną Nonce, która jest używana jako tajny klucz HMAC K do życia tej sesji. Jest to podejście bezpieczne, ale nie jest spokojne, ponieważ odpoczynek jest bezpaństwowy. Ta idea kodu uwierzytelniania wiadomości wydawanego przy logowaniu jest technicznie formą stanu.

Szyfrowanie haseł i przechowywanie ich w bazie danych jest naruszeniem CWE-257.

 10
Author: rook,
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-03-30 16:43:46

Nie jestem pewien, czy czegoś tu brakuje, ale jedną z opcji jest użycie hashowanego hasła jako klucza symetrycznego.

 2
Author: Pushpendra,
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
2013-04-05 09:01:16