Zamierzam używać protokołu OAuth do pobierania wiadomości i kontaktów z Google. Nie chcę za każdym razem prosić użytkownika o zalogowanie się w celu uzyskania tokena dostępu i sekretu. Z tego, co zrozumiałem, muszę je przechowywać w mojej aplikacji w bazie danych lub SharedPreferences
. Ale martwię się trochę o aspekty bezpieczeństwa. Czytałem, że możesz zaszyfrować i odszyfrować tokeny, ale napastnikowi łatwo jest po prostu zdekompilować twój apk i klasy i uzyskać klucz szyfrowania.
Jaka jest najlepsza metoda bezpiecznego przechowywania tych tokenów w systemie Android?
124
Odpowiedzi:
Przechowuj je jako wspólne preferencje . Są one domyślnie prywatne i inne aplikacje nie mają do nich dostępu. Na urządzeniach z dostępem do roota, jeśli użytkownik jawnie zezwala na dostęp do aplikacji, która próbuje je odczytać, aplikacja może z nich korzystać, ale nie można się przed tym chronić. Jeśli chodzi o szyfrowanie, musisz albo wymagać od użytkownika, aby za każdym razem wprowadzał hasło odszyfrowania (w ten sposób pokonując cel buforowania poświadczeń) lub zapisać klucz do pliku, a otrzymasz ten sam problem.
Przechowywanie tokenów zamiast rzeczywistego hasła z nazwą użytkownika ma kilka zalet:
źródło
Możesz je przechowywać w AccountManager . Według tych gości jest to najlepsza praktyka.
Oto oficjalna definicja:
Szczegółowy przewodnik dotyczący korzystania z Menedżera kont:
Jednak ostatecznie AccountManager przechowuje twój token tylko jako zwykły tekst. Dlatego zasugerowałbym zaszyfrowanie swojego sekretu przed zapisaniem ich w AccountManager. Możesz skorzystać z różnych bibliotek szyfrowania, takich jak AESCrypt lub AESCrypto
Inną opcją jest użycie biblioteki Conceal . Jest wystarczająco bezpieczny dla Facebooka i znacznie łatwiejszy w użyciu niż AccountManager. Oto fragment kodu umożliwiający zapisanie tajnego pliku za pomocą funkcji Conceal.
źródło
SharedPreferences nie jest samo w sobie bezpieczną lokalizacją. Na zrootowanym urządzeniu możemy łatwo odczytywać i modyfikować pliki SharedPrefereces xml wszystkich aplikacji. Dlatego tokeny powinny stosunkowo często tracić ważność. Ale nawet jeśli token traci ważność co godzinę, nowsze tokeny nadal mogą zostać skradzione z SharedPreferences. Android KeyStore służy do długoterminowego przechowywania i pobierania kluczy kryptograficznych, które posłużą do zaszyfrowania naszych tokenów w celu ich przechowywania np. W SharedPreferences lub w bazie danych. Klucze nie są przechowywane w procesie aplikacji, więc trudniej jest je złamać.
Ważniejsze od miejsca jest to, w jaki sposób mogą one same być bezpieczne, np. Przy użyciu podpisanych kryptograficznie krótkotrwałych JWT, szyfrowanie ich za pomocą Android KeyStore i wysyłanie ich za pomocą bezpiecznego protokołu
źródło
Teraz załaduj odczytany token dostępu i klucz tajny w pliku build.gradle modułu aplikacji . Następnie musisz zdefiniować zmienną BuildConfig dla tokenu dostępu i klucza tajnego, aby mieć do nich bezpośredni dostęp z poziomu kodu. Twój plik build.gradle może wyglądać następująco:
Możesz użyć tokena dostępu i klucza tajnego w swoim kodzie w następujący sposób:
W ten sposób nie musisz przechowywać tokenu dostępu i klucza tajnego w postaci zwykłego tekstu w projekcie. Więc nawet jeśli ktoś zdekompiluje twój APK, nigdy nie otrzyma twojego tokena dostępu i tajnego, gdy ładujesz je z zewnętrznego pliku.
źródło
Cóż, możesz zabezpieczyć swój token dostępu, wykonując dwie opcje.
źródło