Binder接口调用的鉴权方法

综述

Binder鉴权的核心在于: 在Bn Service端获取接口调用者的信息,判断调用者是否满足权限条件。下面列举一个通过验证调用者证书的鉴权方法。

Coding

例子中包含一个Activity和一个Service,让它们分别运行在不同的进程中,AndroidManifest如下

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".SystemService"
            android:process=":SystemService"
            android:enabled="true"
            android:exported="true">
        </service>

然后声明一个aidl接口

实现一个Service,这个Service在onBind方法中,返回上面aidl接口的实现

鉴权的核心在于checkPermission方法,如果鉴权通过则返回实际结果,如果鉴权失败则抛出异常。

checkPermission方法主要是通过获取调用者的UID,获取包信息中的签名,将签名sha256摘要后在转Base64字符串。通过对比这个字符串来判断调用者的签名是否符合要求。需要注意的是API 28以后GET_SIGNATURES方法被弃用,高版本需要通过GET_SIGNING_CERTIFICATES来获取apk签名。

简单看下调用端

这里的例子就是在push button的时候去bind service,在bind成功的回调中去调用接口。

Last updated

Was this helpful?