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?

Author: mmBs, 2012-04-15

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
 97
Author: Nikolay Elenkov,
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.

Tutaj wpisz opis obrazka

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);
 13
Author: aldok,
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
  1. 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.

Tutaj wpisz opis obrazka

  1. Otwórz keystore.właściwości " pliku i zapisać Token dostępu i tajne w pliku.

Tutaj wpisz opis obrazka

  1. 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"]
        }
    }
    
  2. 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.

 4
Author: Zahidur Rahman Faisal,
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.

 2
Author: apex39,
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.

  1. Użyj save your access token w keystore Androida, który nie będzie odwrócony.
  2. 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
 2
Author: M.Noman,
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