Sobes.tech
Middle+

Kaip užtikrinti saugų prieigą prie autorizacijos ženklelio kitai programai?

sobes.tech AI

Atsakymas iš AI

Yra keletas būdų:

  1. 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ų.

  2. 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ų.

  3. SharedPreferences su MODE_WORLD_READABLE režimu (nerekomenduojama): Išsaugokite token'ą SharedPreferences su MODE_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);
    
  4. Perdavimas per Intent su apribojimais: Perduokite token'ą per Intent (pvz., per startActivity su duomenimis). Tačiau tai yra mažiausiai saugus būdas, nes duomenys Intent gali 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.