Kaip užtikrinti saugų prieigą prie autorizacijos ženklelio kitai programai?
sobes.tech AI
Atsakymas iš AI
Yra keletas būdų:
-
Content Provider su ribotu prieiga: Sukurkite savo
ContentProvider, kuris įgyvendins logiką gauti token'ą. Ribokite prieigą naudodami leidimus (permissions), kurie bus apibrėžti jūsų programėlės manifeste. Kita programėlė turės prašyti šio leidimo, kad galėtų naudotis Content Provider.<!-- Jūsų programėlės AndroidManifest.xml --> <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>// Pavyzdys, kaip įgyvendinti ContentProvider public class TokenContentProvider extends ContentProvider { // ... query() įgyvendinimas, patikrinant leidimą ... }Kita programėlė turės deklaruoti šį leidimą:
<!-- Kitos programėlės AndroidManifest.xml --> <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />protectionLevel="signature"lygis garantuoja, kad prieigą prie Content Provider galės gauti tik ta programėlė, pasirašyta tuo pačiu raktu kaip ir jūsų. Tai yra saugiausias būdas keistis duomenimis tarp programėlių. -
Service su prisijungimu ir UID/PackageName patikrinimu: Sukurkite
Service, kuris teiks metodą token'ui gauti. Kita programėlė galės prisijungti prie šios paslaugos (bindService). Paslaugos viduje, apdorodama užklausą, galite gauti iškviečiančios programėlės UID arba PackageName ir patikrinti, ar ji yra patikima.// Pavyzdys, kaip įgyvendinti Service su AIDL public class TokenService extends Service { private ITokenService.Stub binder = new ITokenService.Stub() { @Override public String getToken() throws RemoteException { String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid()); if (isAllowedPackage(packages)) { return "your_auth_token"; } else { throw new SecurityException("Neautorizuotas prieiga"); } } }; @Nullable @Override public IBinder onBind(Intent intent) { return binder; } }AIDL (Android Interface Definition Language) naudojamas apibrėžti paslaugos sąsają tarp procesų.
-
SharedPreferences su
MODE_WORLD_READABLErežimu (nerekomenduojama): Išsaugokite token'ąSharedPreferencessuMODE_WORLD_READABLEžyme. Tai leidžia bet kuriai programėlei perskaityti šį failą. Šis metodas yra pasenęs ir nerekomenduojamas dėl žemo saugumo lygio.// Nesaugus metodas (pasenęs) SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE); String token = preferences.getString("auth_token", null); -
Perdavimas per Intent su apribojimais: Perduokite token'ą per
Intent(pvz., perstartActivitysu duomenimis). Tačiau tai yra mažiausiai saugus būdas, nes duomenysIntentgali būti perimti. Jei reikia perduoti token'ą tokiu būdu, naudokite šifruotus duomenis ir patikrinkite skaitmeninį parašą arba PackageName.// Pavyzdys (reikalauja papildomų saugumo priemonių) Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN"); intent.putExtra("token", "your_auth_token"); // Token'as turi būti šifruotas startActivity(intent);
Pasirinkimas priklauso nuo saugumo reikalavimų ir pasitikėjimo lygio tarp jūsų programėlės ir programėlės, kuriai reikalingas prieigos prie token'o. Saugiausios yra Content Provider ir Service su aiškia iškviečiančios programėlės patikra.