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.
-
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). -
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.
-
SharedPreferences s režimom
MODE_WORLD_READABLE(neodporúča sa): Uložiť token vSharedPreferencess príznakomMODE_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); -
Prenos cez Intent s obmedzeniami: Preniesť token cez
Intent(napríklad cezstartActivitys 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.