Ինչպե՞ս ապահովել անվտանգ մուտք դեպի թույլտվության նշան մյուս հավելվածի համար։
sobes.tech AI
Պատասխան AI-ից
Կան մի քանի եղանակներ:
-
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"մակարդակը ապահովում է, որ միայն նույն բանալիով ստորագրված հավելվածներն ունենան մուտք։ Սա առավել անվտանգ տարբերակ է տվյալների փոխանակման համար։ -
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-ը օգտագործվում է ծառայության միջպրոցեսային փոխազդեցության համար։
-
SharedPreferences՝
MODE_WORLD_READABLEռեժիմով (չի խորհուրդ տրվում): Տեղադրեք տոքենըSharedPreferences-ում՝MODE_WORLD_READABLEնշանով։ Սա թույլ է տալիս ցանկացած հավելվածի կարդալ այդ ֆայլը։ Այս մեթոդը հնացած է և չի խորհուրդ տրվում օգտագործել անվտանգության ցածր մակարդակի պատճառով։// Անվտանգ չհամարվող մեթոդ (հնացած) SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE); String token = preferences.getString("auth_token", null); -
Տեղափոխում
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՝ հստակ ստուգումներով։