Sobes.tech
Middle+

Ինչպե՞ս ապահովել անվտանգ մուտք դեպի թույլտվության նշան մյուս հավելվածի համար։

sobes.tech AI

Պատասխան AI-ից

Կան մի քանի եղանակներ:

  1. Content Provider սահմանափակված մուտքով: Ստեղծեք ձեր ContentProvider, որը կիրականացնի տոքենի ստացման տրամաբանությունը։ Մուտքը սահմանափակեք թույլտվություններով (permissions), որոնք կսահմանվեն ձեր հավելվածի մանիֆեստում։ Այլ հավելվածը պետք է խնդրի այդ թույլտվությունը, որպեսզի կարողանա օգտվել Content Provider-ից։

    <!-- Ձեր հավելվածի 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>
    
    // Օրինակ՝ ContentProvider-ի իրականացման
    public class TokenContentProvider extends ContentProvider {
        // ... query() իրականացումը տոքենի տրամադրման համար թույլտվության ստուգմամբ ...
    }
    

    Այլ հավելվածը պետք է հայտարարի այդ թույլտվության խնդրանքը՝

    <!-- Այլ հավելվածի AndroidManifest.xml-ում -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    protectionLevel="signature" մակարդակը ապահովում է, որ միայն նույն բանալիով ստորագրված հավելվածներն ունենան մուտք։ Սա առավել անվտանգ տարբերակ է տվյալների փոխանակման համար։

  2. Service-ով կապակցում և UID/PackageName ստուգում: Ստեղծեք Service, որը կտրամադրի մեթոդ տոքենի ստացման համար։ Այլ հավելվածը կարող է կապվել այդ ծառայության հետ (bindService)։ Ծառայության ներսում, հարցման մշակման ժամանակ, կարող եք ստանալ caller-ի UID կամ PackageName և ստուգել, արդյոք այն վստահելի է։

    // 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("Անվավեր մուտք");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL-ը օգտագործվում է ծառայության միջպրոցեսային փոխազդեցության համար։

  3. SharedPreferences՝ MODE_WORLD_READABLE ռեժիմով (չի խորհուրդ տրվում): Տեղադրեք տոքենը SharedPreferences-ում՝ MODE_WORLD_READABLE նշանով։ Սա թույլ է տալիս ցանկացած հավելվածի կարդալ այդ ֆայլը։ Այս մեթոդը հնացած է և չի խորհուրդ տրվում օգտագործել անվտանգության ցածր մակարդակի պատճառով։

    // Անվտանգ չհամարվող մեթոդ (հնացած)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Տեղափոխում Intent-ով սահմանափակումներով: Տեղափոխեք տոքենը Intent-ով (օրինակ՝ startActivity-ով տվյալներով): Սակայն սա ամենաանվտանգ մեթոդն է, քանի որ Intent-ի տվյալները կարող են խափանվել։ Եթե անհրաժեշտ է այդպես փոխանցել, օգտագործեք կոդավորված տվյալներ և ստուգեք թվային ստորագրությունը կամ ընդունող հավելվածի PackageName-ը։

    // Օրինակ (պահանջում է լրացուցիչ անվտանգության միջոցներ)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Տոքենը պետք է լինի կոդավորված
    startActivity(intent);
    

Ընտրությունը կախված է անվտանգության պահանջներից և վստահության մակարդակից ձեր հավելվածի և անհրաժեշտ հավելվածի միջև։ Անվտանգագույններն են Content Provider և Service՝ հստակ ստուգումներով։