Sobes.tech
Middle+

Wie gewährleistet man einen sicheren Zugriff auf das Autorisierungstoken für eine andere Anwendung?

sobes.tech KI

Antwort von AI

Es können mehrere Methoden in Betracht gezogen werden.

  1. Content Provider mit eingeschränktem Zugriff: Erstellen Sie einen eigenen ContentProvider, in dem die Logik zum Abrufen des Tokens implementiert wird. Den Zugriff beschränken Sie mit Berechtigungen, die im Manifest Ihrer Anwendung definiert werden. Eine andere Anwendung muss diese Berechtigung anfordern, um auf den Content Provider zugreifen zu können.

    <!-- In AndroidManifest.xml Ihrer Anwendung -->
    <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>
    
    // Beispiel für die Implementierung eines ContentProviders
    public class TokenContentProvider extends ContentProvider {
        // ... Implementierung von query() zum Ausgeben des Tokens mit Berechtigungsprüfung ...
    }
    

    Eine andere Anwendung muss die Anfrage für diese Berechtigung deklarieren:

    <!-- In AndroidManifest.xml der anderen Anwendung -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    Der protectionLevel="signature" stellt sicher, dass nur Anwendungen, die mit demselben Schlüssel signiert sind, Zugriff auf den Content Provider haben. Dies ist die sicherste Methode für den Datenaustausch zwischen Anwendungen desselben Unternehmens (derselben Entwickler).

  2. Service mit Bindung und UID/PackageName-Überprüfung: Erstellen Sie einen Service (Service), der eine Methode zum Abrufen des Tokens bereitstellt. Eine andere Anwendung kann sich an diesen Service (bindService) binden. Innerhalb des Dienstes kann beim Verarbeiten der Anfrage die UID oder der PackageName des aufrufenden Anwendungsprogramms ermittelt und überprüft werden, ob es vertrauenswürdig ist.

    // Beispiel für die Implementierung eines Service mit AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Überprüfung des aufrufenden Programms anhand getCallingUid() oder getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Überprüfung der Pakete auf die Liste der erlaubten
                if (isAllowedPackage(packages)) {
                    // Token zurückgeben (angenommen, das Token wird sicher gespeichert)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Unbefugter Zugriff");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) wird verwendet, um die Service-Schnittstelle für die Interprozesskommunikation zu definieren.

  3. SharedPreferences mit MODE_WORLD_READABLE (nicht empfohlen): Speichern Sie das Token in SharedPreferences mit der Flagge MODE_WORLD_READABLE. Dies ermöglicht jedem Programm, diese Datei zu lesen. Diese Methode ist veraltet und wird aufgrund der niedrigen Sicherheitsebene nicht empfohlen.

    // Unsicherer, veralteter Ansatz
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Übergabe über Intent mit Einschränkungen: Übergeben Sie das Token über Intent (z.B. über startActivity mit Daten). Dies ist jedoch die unsicherste Methode, da die Daten im Intent abgefangen werden können. Wenn das Token auf diese Weise übertragen werden muss, sollten verschlüsselte Daten verwendet und digitale Signaturen oder PackageName des empfangenden Programms überprüft werden.

    // Beispiel (erfordert zusätzliche Sicherheitsmaßnahmen)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Das Token sollte verschlüsselt sein
    startActivity(intent);
    

Die Wahl der Methode hängt von den Sicherheitsanforderungen und dem Vertrauensniveau zwischen Ihrer Anwendung und der Anwendung ab, die Zugriff auf das Token benötigt. Die sichersten Methoden sind Content Provider und Service mit expliziter Überprüfung des aufrufenden Programms.