Jak bezpiecznie przechowywać token dostępu i tajne w Androidzie?
Użyję oAuth do pobierania maili i kontaktów z google. Nie chcę za każdym razem prosić użytkownika o zalogowanie się, aby uzyskać token dostępu i sekret. Z tego co zrozumiałem, muszę je przechowywać z moją aplikacją albo w bazie danych albo SharedPreferences
. Ale jestem trochę zaniepokojony aspektami bezpieczeństwa z tym. Czytałem, że można zaszyfrować i odszyfrować tokeny, ale łatwo jest atakującemu po prostu dekompilować apk i klasy i uzyskać klucz szyfrowania.
Jaka jest najlepsza metoda na bezpiecznie przechowywać te tokeny w Androidzie?
5 answers
Przechowuj je jako wspólne preferencje. Są one domyślnie prywatne, a inne aplikacje nie mają do nich dostępu. Na zakorzenionych urządzeniach, jeśli użytkownik wyraźnie zezwala na dostęp do jakiejś aplikacji, która próbuje je odczytać, aplikacja może być w stanie z nich korzystać, ale nie można przed tym chronić. Jeśli chodzi o szyfrowanie, musisz albo wymagać od użytkownika wprowadzenia hasła deszyfrującego za każdym razem (w ten sposób naruszając cel buforowania poświadczeń), albo zapisać klucz do pliku, a otrzymasz ten sam problem.
Istnieje kilka korzyści z przechowywania tokenów zamiast rzeczywistego hasła nazwy użytkownika:
- aplikacje innych firm nie muszą znać hasła, a użytkownik może być pewien, że wysyła je tylko do oryginalnej strony (Facebook, Twitter, Gmail itp.)
- nawet jeśli ktoś ukradnie token, nie zobaczysz hasła (które użytkownik może używać również na innych stronach)
- tokeny zazwyczaj mają żywotność i wygasają po pewnym czasie
- tokeny mogą zostać odwołane jeśli podejrzewasz, że zostały naruszone
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-04-15 16:03:52
Możesz je przechowywać w AccountManager . Według nich to najlepsza praktyka.
Oto oficjalna definicja:
Klasa ta zapewnia dostęp do scentralizowanego rejestru użytkownika konta internetowe. Użytkownik wprowadza dane uwierzytelniające (nazwa użytkownika i hasło) raz na konto, przyznając aplikacjom dostęp do zasobów internetowych z zatwierdzeniem "jednym kliknięciem".
Szczegółowy przewodnik jak używać AccountManager:
Jednak na końcu AccountManager przechowuje tylko twój token jako zwykły tekst. Sugerowałbym więc zaszyfrowanie twojego sekretu przed zapisaniem go w AccountManager. Możesz używać różnych bibliotek szyfrujących, takich jak AESCrypt lub AESCrypto
Inną opcją jest użycie Conceal library . Jest wystarczająco bezpieczny. dla Facebook i znacznie łatwiejsze w użyciu niż AccountManager. Oto fragment kodu do zapisania tajnego pliku za pomocą Conceal.
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
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
2018-05-01 13:52:12
- z panelu projektu Android Studio wybierz "pliki projektów" i utwórz nowy plik o nazwie " keystore.właściwości " w katalogu głównym projektu.
- Otwórz keystore.właściwości " pliku i zapisać Token dostępu i tajne w pliku.
-
Teraz załaduj Token read the Access i ukryj w swojej aplikacji modułu .gradle plik. Następnie należy zdefiniować Zmienna BuildConfig dla Twojego Tokena dostępu i tajnego, dzięki czemu możesz uzyskać do nich bezpośredni dostęp z kodu. Twoja Budowa.gradle może wyglądać następująco:
... ... ... android { compileSdkVersion 26 // Load values from keystore.properties file def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) defaultConfig { applicationId "com.yourdomain.appname" minSdkVersion 16 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Create BuildConfig variables buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"] buildConfigField "String", "SECRET", keystoreProperties["SECRET"] } }
-
Możesz użyć Tokena dostępu i tajemnicy w kodzie w następujący sposób:
String accessToken = BuildConfig.ACCESS_TOKEN; String secret = BuildConfig.SECRET;
W ten sposób nie musisz przechowywać Tokena dostępu i tajemnicy w zwykłym tekście wewnątrz projektu. Więc nawet jeśli ktoś dekompiluje Twój APK, nigdy nie otrzyma Twojego Tokena dostępu i tajemnicy podczas ładowania z zewnętrznego pliku.
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
2018-01-04 06:37:22
SharedPreferences nie jest bezpiecznym miejscem. Na zakorzenionym urządzeniu możemy łatwo odczytywać i modyfikować wszystkie aplikacje SharedPrefereces xml. nawet jeśli token wygasa co godzinę, nowsze tokeny nadal mogą zostać skradzione z SharedPreferences. KeyStore Androida powinien być używany do długoterminowego przechowywania i pobierania kluczy kryptograficznych, które będą używane do szyfrowania naszych tokenów w celu przechowywania ich np. w SharedPreferences. Klucze nie są przechowywane w procesie aplikacji, więc są trudniejsze do skompromitowania.
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
2018-03-01 09:13:25
Cóż, możesz zabezpieczyć dostęp do tokena, wykonując dwie opcje.
- Użyj save your access token w keystore Androida, który nie będzie odwrócony.
- Użyj funkcji NDK z niektórymi obliczeniami, które zapisują token i NDK z kodem c++, który jest bardzo trudny do odwrócenia
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
2018-08-11 17:14:52