2012-08-06 10 views
5

Pracuję więc teraz nad aplikacją mobilną, która będzie wysyłać żądania do REST API zbudowanego z Django.Jak udostępnić tajny klucz mojej aplikacji mobilnej serwerowi podczas jego pierwszego generowania?

W celu zabezpieczenia interfejsu API planuję użyć systemu uwierzytelniania par prywatnego/publicznego.

Workflow mam przemyślane wychodzi coś takiego:

  1. użytkownik loguje się za pomocą Facebooka
  2. Gdy użytkownik podpisuje aplikacja generuje klucz
  3. Klucz prywatny jest dzielona pomiędzy serwer i aplikacja, aby serwer mógł mapować ten klucz prywatny do określonego użytkownika.
  4. Za każdym razem, gdy aplikacja mobilna zgłasza żądanie, aplikacja generuje HMAC/podpis przy użyciu parametrów żądania i klucza prywatnego. Oprócz HMAC aplikacja wysyła także identyfikator użytkownika użytkownika, który go wysłał (będzie to działać jako klucz publiczny).
  5. Po otrzymaniu żądania serwer generuje własny HMAC. Przyjmuje on identyfikator użytkownika i wyszukuje klucz prywatny w tabeli. Za pomocą klucza prywatnego odtwarza HMAC z parametrami żądania i porównuje go z HMAC wysłanym przez aplikację mobilną. Jeśli serwer i telefon komórkowy mają pasujące HMAC, wówczas wykonuje żądanie.

Teraz mój problem leży w kroku 3, w którym klucz prywatny musi być w jakiś sposób udostępniony między aplikacją mobilną a serwerem. Jak mogę bezpiecznie wysłać klucz prywatny?

Odpowiedz

4

Zacznę od pytania, dlaczego część serwerowa aplikacji musi znać klucz prywatny. Jeśli chce tylko uwierzytelnić użytkownika, potrzebuje tylko klucza publicznego i identyfikatora użytkownika, a identyfikator użytkownika nie może być kluczem publicznym (potrzebny jest sposób sprawdzenia, który klucz publiczny jest używany).

Na przykład, proces dzielenia klucz, twój krok trzeci, mógłby wyglądać tak:

  1. Aplikacja generuje publiczno-prywatnego pary kluczy.
  2. Aplikacja wysyła klucz publiczny do serwera, nie dbając o to, kto może go przechwycić.
  3. Serwer przechowuje ten klucz publiczny, kojarząc go z identyfikatorem podanym przez użytkownika.

Może integracja z Facebookiem jest częścią, która uniemożliwia to. Nie do końca rozumiem, jak Facebook wkracza w ten cały proces.

Jedną rzeczą, która może sprawić, że przeniesienie klucza jest nieco bezpieczniejsze, jest użycie wielu kanałów do przesłania go.

Na przykład aplikacja może wysłać klucz prywatny wygenerowany za pomocą interfejsu API REST, ale zaszyfrować go za pomocą symetrycznego schematu szyfrowania. Symetryczny klucz szyfrowania można wysłać za pośrednictwem innego nośnika, takiego jak poczta e-mail lub SMS, ponieważ jest to aplikacja mobilna, a nawet zautomatyzowane połączenie telefoniczne z numerem podanym przez zarejestrowanego użytkownika. Klucz może być losowym hasłem, które generuje rzeczywisty symetryczny klucz szyfrowania, aby upewnić się, że jest to coś, co może wpisywać użytkownik. Następnie, aby odblokować aplikację, użytkownik musi wpisać to hasło na ekranie, a tajny klucz zostanie odblokowany.

To tylko zwiększa bezpieczeństwo transferu o niewielki margines, zwłaszcza biorąc pod uwagę fakt, że jeśli możesz przechwycić transmisję klucza prywatnego, prawdopodobnie możesz przechwycić wiadomość e-mail zawierającą hasło. Moim zdaniem nieprzesyłanie klucza prywatnego na serwer byłoby nie tylko optymalne, ale wymagane.

Powiązane problemy