2015-10-05 67 views
1

我想使用JarSigner从Java代码验证APK。我正在写编程安装的APK(就像谷歌播放)的应用程序,并在安装前检查以下内容:使用JarSigner以编程方式验证APK

  • 验证.SF文件的签名itself.Verify摘要在每个条目中列出 .SF文件与 清单中的每个对应部分。
    验证清单中每个相应部分的.SF文件 中每个条目中列出的摘要。
    读取 中的每个文件,该文件在.SF文件中有一个条目。在读取时, 计算文件的摘要,然后将结果与清单部分中该文件的 摘要进行比较。

这很像与命令行选项-verify

我抬头Java文档运行的jarsigner,我想我可以用this.But JarSigner.verifyJar() API,这是不公开的方法。有没有人试图从Java代码验证APK?将欣赏任何指针。

回答

1

你可以得到你的签名是这样的:

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
    context.getPackageName(), PackageManager.GET_SIGNATURES); 

List<String> list = new ArrayList<>(); 

for (Signature signature : packageInfo.signatures) { 
    MessageDigest md = MessageDigest.getInstance("SHA"); 
    md.update(signature.toByteArray()); 
    final String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT); 
    list.add(currentSignature); 
} 

的全部细节退房this article

+0

谢谢。这种方法要求应用程序已经安装在设备上,并且PackageManager知道它。但我的用例是不同的。我正在编写一个安装APK的自定义应用程序,在安装之前,我想确保它通过验证。 1.验证.SF文件本身的签名。 2.使用清单中的每个对应部分验证.SF文件中每个条目中列出的摘要。 3.阅读.SF文件中具有条目的JAR文件中的每个文件。 – Sai

+0

啊,好的。我会建议更新你的问题,包括那些信息! – Buddy

+0

@Sai这个解决方案应该仍然有效。但是,不要调用'getPackageInfo',而是调用'getPackageArchiveInfo'并将路径传递给APK。 – dennisdrew