如何创建两个Android应用,其中app" A"创建文件,只有应用程序" B"可以读取文件吗?乍一看,Context.grantUriPermission似乎是一个技巧,因为它允许限制对某些包的访问,如下所示:
//grant permision for app with package "packageName", eg. before starting other app via intent
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
(以上内容来自" How to use support FileProvider for sharing content to other apps?")
不幸的是,任何人都可以使用给定的包名创建应用。因此,这种限制方法不是很安全。
是否有更安全的方法来限制文件访问?也许通过检索调用应用程序的公钥证书(app" B"在这种情况下)?
答案 0 :(得分:2)
也许通过检索调用应用程序的公钥证书(app" B"在这种情况下)?
这绝对是可能的:
payload
public static String getSignatureHash(Context ctxt, String packageName)
throws NameNotFoundException, NoSuchAlgorithmException {
MessageDigest md=MessageDigest.getInstance("SHA-256");
Signature sig=
ctxt.getPackageManager()
.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0];
return(toHexStringWithColons(md.digest(sig.toByteArray())));
}
// based on https://stackoverflow.com/a/2197650/115145
public static String toHexStringWithColons(byte[] bytes) {
char[] hexArray=
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F' };
char[] hexChars=new char[(bytes.length * 3) - 1];
int v;
for (int j=0; j < bytes.length; j++) {
v=bytes[j] & 0xFF;
hexChars[j * 3]=hexArray[v / 16];
hexChars[j * 3 + 1]=hexArray[v % 16];
if (j < bytes.length - 1) {
hexChars[j * 3 + 2]=':';
}
}
return new String(hexChars);
}
的结果与您从JDK getSignatureHash()
获得的格式相同,因此您可以生成相应的哈希值,将其保存在某处(例如,字符串资源),以及将它与你在飞行中确定的那个进行比较。然后,如果声称是B的应用程序没有正确的哈希值,则不要发送keytool
来使用。
(请注意,我需要更新此代码以处理具有多个签名的APK,这是现在的事情)