Sobes.tech
Middle+

Ako zabezpečiť bezpečný prístup k autorizačnému tokenu pre inú aplikáciu?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko spôsobov.

  1. Content Provider s obmedzeným prístupom: Vytvorte vlastný ContentProvider, ktorý bude implementovať logiku na získanie tokenu. Obmedzte k nemu prístup pomocou povolení (permissions), ktoré budú definované v manifeste vašej aplikácie. Iná aplikácia bude musieť požiadať o toto povolenie, aby mohla pristupovať k Content Provider.

    <!-- V AndroidManifest.xml vašej aplikácie -->
    <permission android:name="com.your_app.PERMISSION_GET_TOKEN"
                android:label="@string/permission_get_token_label"
                android:description="@string/permission_get_token_description"
                android:protectionLevel="signature" />
    
    <application ...>
        <provider
            android:name=".TokenContentProvider"
            android:authorities="com.your_app.token_provider"
            android:exported="true"
            android:readPermission="com.your_app.PERMISSION_GET_TOKEN"
            ... />
    </application>
    
    // Príklad implementácie ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... implementácia query() na vydanie tokenu s kontrolou povolenia ...
    }
    

    Iná aplikácia bude musieť deklarovať požiadavku na toto povolenie:

    <!-- V AndroidManifest.xml inej aplikácie -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    Úroveň protectionLevel="signature" zabezpečuje, že k Content Provider bude mať prístup iba aplikácia podpísaná rovnakým kľúčom ako vaša aplikácia. Toto je najbezpečnejšia možnosť pri výmene dát medzi aplikáciami od jednej spoločnosti (jedného vývojára).

  2. Service s pripojením a kontrolou UID/PackageName: Vytvorte službu (Service), ktorá bude poskytovať metódu na získanie tokenu. Iná aplikácia sa môže pripojiť k tejto službe (bindService). Vo vnútri služby, pri spracovaní požiadavky, môžete získať UID alebo PackageName volajúcej aplikácie a overiť, či je dôveryhodná.

    // Príklad implementácie Service s AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Kontrola volajúcej aplikácie pomocou getCallingUid() alebo getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Kontrola balíkov na zhodu so zoznamom povolených
                if (isAllowedPackage(packages)) {
                    // Vrátiť token (predpokladá sa, že token je bezpečne uložený)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Neoprávnený prístup");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) sa používa na definovanie rozhrania služby pre medziprocesovú komunikáciu.

  3. SharedPreferences s režimom MODE_WORLD_READABLE (neodporúča sa): Uložiť token v SharedPreferences s príznakom MODE_WORLD_READABLE. To umožní ktorejkoľvek aplikácii prečítať tento súbor. Tento spôsob je zastaraný a neodporúča sa ho používať kvôli nízkej úrovni bezpečnosti.

    // Nebezpečná metóda (zastaralá)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Prenos cez Intent s obmedzeniami: Preniesť token cez Intent (napríklad cez startActivity s dátami). Avšak, toto je najmenej bezpečný spôsob, pretože údaje v Intent môžu byť zachytené. Ak je potrebné preniesť token takýmto spôsobom, mali by ste použiť šifrované údaje a overiť digitálny podpis alebo PackageName prijímajúcej aplikácie.

    // Príklad (vyžaduje ďalšie bezpečnostné opatrenia)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Token by mal byť zašifrovaný
    startActivity(intent);
    

Výber metódy závisí od požiadaviek na bezpečnosť a úrovne dôvery medzi vašou aplikáciou a aplikáciou, ktorej je potrebný prístup k tokenu. Najbezpečnejšie sú Content Provider a Service s jasnou kontrolou volajúcej aplikácie.