2016-06-21 14 views
7

Mam usługę, w której każdy z użytkowników ma klucz API. Muszę przechowywać klucze, aby mogły być używane do sprawdzania poprawności żądań interfejsu API.Przechowywanie kluczy API na serwerze

Jeśli przechowuję klucze w postaci zwykłego tekstu w mojej bazie danych, martwię się scenariuszem uzyskania przez kogoś dostępu do bazy danych, przechwytywaniem wszystkich kluczy interfejsu API zwykłego tekstu, a następnie wykorzystywaniem ich do podszywania się pod inne osoby (najprawdopodobniej będą większe problemy jeśli ktoś ma dostęp do bazy danych).

Jest to podobne do przechowywania haseł użytkowników, w których przechowywany jest skrót i sprawdzanie poprawności za jego pomocą - jednak większość interfejsów API umożliwia przeglądanie kluczy API, co oznacza, że ​​muszą być przechowywane w pewien możliwy do odzyskania sposób.

Czy jest to najlepsza praktyka?

Dzięki

Odpowiedz

4

Groźba, że ​​ktoś pobiera z bazy danych i pobiera klucze oznacza, że ​​mogą korzystać z klawiszy API do dostępu do danych w bazie danych, które już masz, więc nie ma tam wygrać.

Zagrożenie, że ktoś może uzyskać dostęp do bazy danych, uzyskać hasła, oznacza, że ​​mogą ponownie użyć tych haseł na innych stronach internetowych o tej samej nazwie użytkownika, ponieważ ludzie często używają swoich haseł.

Innym powodem, dla którego hasła w jasnym lub łatwym do przechodzenia rewersie jest to, że ktoś w Twojej firmie może uzyskać hasła i zacząć robić złe rzeczy działając jako użytkownik. Jakie jest ryzyko, które możesz mieć, jeśli klucze API są jasne.

Zazwyczaj HMAC to rozwiązanie do kryptograficznego obliczania bezpiecznej wartości z pojedynczego tajnego klucza i pewnej wartości publicznej.

Zobacz HMAC. Za pomocą HMAC możesz załadować tajny klucz do pamięci za pomocą aplikacji (plik konfiguracyjny, odczyt Amazon KMS, wpisany przy starcie aplikacji lub jakkolwiek chcesz zdobyć tam ten tajny klucz).

W bazie danych zapisz token. Token = UUID() na przykład. Token powinien być unikalny dla użytkownika, token może być wersjonowany na wypadek potrzeby regeneracji, a token może być losowy (jak UUID). Token nie jest tajny.

Klucz API jest obliczana za pomocą klucza tajnego (SK) i tokenu użytkownika (UT) w następujący sposób:

API_SECRET = HMAC(SK, UT) 

Następnie rozprowadzić że API_KEY i API_SECRET dla użytkownika, a gdy użytkownik próbuje się połączyć, Państwo obliczyć API_SECRET: rekord użytkownika

  1. uzyskać z bazy danych (pewnie już prosząc użytkownika o dostarczenie jego nazwę)
  2. Oblicz API_SECRET z UT w bazie:

    API_SECRET_DB = HMAC (SK, UT)

  3. Porównać obliczone API_SECRET_DB do jednego przewidzianego we wniosku:

    if (API_SECRET_DB == API_SECRET_FROM_REQUEST) {// logowania użytkownika }

Konkluzja, trzeba tylko chronić klucz tajny i nie każdy grzech być wiarygodnym.

+0

Dlaczego po prostu nie używać tajnego klucza serwera do szyfrowania każdego klucza API? Gdy klucz API pojawi się w żądaniu, zaszyfruj go i porównaj z zapisaną, zaszyfrowaną wartością. Odszyfruj zapisaną wartość, jeśli klucz API ma zostać wyświetlony. –

+0

HAMC to jednokierunkowe szyfrowanie powszechnie stosowane w tego typu scenariuszach. Weźmy pod uwagę rodzaj szyfrowania, z wyjątkiem tego, że jest to jeden sposób, więc nie można odszyfrować danych. – Jonathan

+0

Program OP pytany o przeglądanie kluczy API. W przypadku jednokierunkowego mieszania, w którym nie trzeba odzyskiwać oryginału, użyłbym skrótu hasła, na przykład bcrypt lub scrypt, aby uzyskać kluczowe rozciąganie i solenie. –

Powiązane problemy