在具有多个允许签名的Android服务上实现签名级安全性

jel*_*ord 24 java security android ipc aidl

我正在开发一个包含大量个人用户信息的应用程序 - 例如Facebook联系人等等......现在,我希望能做的事情之一(并且已经完成,非常有效)使用Android的内置进程间通信协议(AIDL)向"第三方"应用程序开放应用程序的一部分.到现在为止还挺好.

这就是问题所在:因为我们参与处理了大量的个人信息,所以我们必须非常小心谁能够访问它,不能访问它; 具体来说,只有"受信任"的应用程序才能够这样做.因此,执行此操作的自然方法是在我们声明服务的AndroidManifest.xml文件中使用自定义权限.我的问题是这样的:我希望能够实现签名级保护(类似于正常的"签名"权限级别),但有一点点:

不仅希望使用我们的内部签名签名的应用程序能够访问服务.我希望能够在运行时构建一个"可信签名"列表(或者如果有更好的方法,那么可能还有其他时间?)能够根据可信密钥列表检查传入请求.

这将以与我认为的正常"签名"权限级别相同的方式满足安全性约束 - 只有"可信密钥列表"上的程序才能访问服务,并且密钥很难欺骗(如果可能的话)? ) - 但还有额外的好处,我们不必签署每个使用API​​和我们内部团队密钥的应用程序.

这在Android中是否可行?如果是这样,有什么特殊要求吗?

谢谢

jel*_*ord 18

我现在已经找到了这个问题的答案,但是为了将来的任何人,我会留下它.

我开启了关于android-security-discuss的讨论.链接:http://groups.google.com/group/android-security-discuss/browse_thread/thread/e01f63c2c024a767

简短回答:

    private boolean checkAuthorised(){
        PackageManager pm = getPackageManager();
        try {
            for (Signature sig :
                pm.getPackageInfo(pm.getNameForUid(getCallingUid()),
                        PackageManager.GET_SIGNATURES).signatures){
                LogUtils.logD("Signature: " + sig.toCharsString());
                if (Security.trustedSignatures.get(sig.toCharsString()) != null) {
                    return true;
                }
            }
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        LogUtils.logD("Couldn't find signature in list of trusted keys! Possibilities:");
        for(String sigString : Security.trustedSignatures.keySet()){
            LogUtils.logD(sigString);
        }

        /* Crash the calling application if it doesn't catch */
        throw new SecurityException();

    }
Run Code Online (Sandbox Code Playgroud)

其中Security.trustedSignatures是表单的Map:

Map<String,String>().put("public key","some description eg. name");
Run Code Online (Sandbox Code Playgroud)

将此方法放在外部进程调用的任何代码中(即在您的接口中).请注意,这不会在RemoteService的onBind()方法中产生所需的效果.