AccountManager 和签名检查

Posted

技术标签:

【中文标题】AccountManager 和签名检查【英文标题】:AccountManager and signature check 【发布时间】:2017-11-16 16:17:44 【问题描述】:

Security tips与AccountManager相关的章节提到:

如果凭据仅由您创建的应用程序使用,您可以 验证访问 AccountManager 的应用程序使用 checkSignature().

我应该在代码的哪里检查签名?我已经尝试使用Binder.getCallingUid() 在我自己的AbstractAccountAuthenticator 实现中获取调用进程的UID,但是当系统进程执行IPC 时它返回1000。我需要获取尝试访问我的应用创建的帐户的其他应用的 UID/包名称,因为我想在返回身份验证令牌之前执行 checkSignature 检查。

【问题讨论】:

【参考方案1】:

事实证明它相当简单。真正调用者的包名、uid 和 pid 包含在作为参数传递的Bundle 中。此代码应驻留在AbstractAccountAuthenticator 的实现中。

public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
                           String authTokenType, Bundle bundle) 
    try 
        PackageManager packageManager = context.getPackageManager();
        String callerPackageName = bundle.getString("androidPackageName");
        // Caller app must be signed with the same key to get the auth token
        int signatureResult = packageManager.checkSignatures(BuildConfig.APPLICATION_ID,
                callerPackageName);
        if (signatureResult >= PackageManager.SIGNATURE_MATCH) 
            return [bundle with the auth token];
         else 
            return Bundle.EMPTY;
        

【讨论】:

以上是关于AccountManager 和签名检查的主要内容,如果未能解决你的问题,请参考以下文章

通过 Google App Sign 更新客户经理和签名密钥

更改我所有已发布应用的签名密钥。是不是可以?

更改我所有已发布应用程序的签名密钥。有可能吗?

Android内存泄漏accountmanager依赖

在 Android 上重命名帐户 (AccountManager)

Android:Google SSO - OAuth 还是 AccountManager?或两者?