安全地限制对FileProvider的访问

时间:2017-02-22 20:38:47

标签: android android-contentprovider android-fileprovider

如何创建两个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"在这种情况下)?

1 个答案:

答案 0 :(得分:2)

  

也许通过检索调用应用程序的公钥证书(app" B"在这种情况下)?

这绝对是可能的:

payload

(来自my SignatureUtils class

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,这是现在的事情)