【问题标题】:Verifying an APK programmatically using JarSigner使用 JarSigner 以编程方式验证 APK
【发布时间】:2016-01-02 10:51:08
【问题描述】:

我想使用 JarSigner 从 Java 代码验证 APK。我正在编写一个以编程方式安装 APK 的应用程序(很像 Google Play),在安装它之前检查以下内容:

  • 验证 .SF 文件本身的签名。验证列出的摘要 在 .SF 文件中的每个条目中与 清单。
    验证 .SF 文件中每个条目中列出的摘要 与清单中的每个相应部分。
    读取每个文件 在 .SF 文件中有条目的 JAR 文件。在读的时候, 计算文件的摘要,然后将结果与 清单部分中此文件的摘要。

这很像在命令行上使用 -verify 选项运行 jarsigner

我查阅了 Java 文档,我想我可以为此使用 JarSigner.verifyJar() API。但这不是公共方法。有没有人尝试从 Java 代码验证 APK?将不胜感激任何指针。

【问题讨论】:

    标签: android jarsigner jar-signing


    【解决方案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了解完整详情。

    【讨论】:

    • 谢谢。这种方法要求应用程序已经安装在设备上并且 PackageManager 知道它。但我的用例不同。我正在编写一个安装 APK 的自定义应用程序,在安装之前,我想确保它通过验证。 1. 验证 .SF 文件本身的签名。 2. 验证 .SF 文件中每个条目中列出的摘要与清单中的每个相应部分。 3. 读取 JAR 文件中每个在 .SF 文件中有条目的文件。
    • 嗯,好的。我建议您更新您的问题以包含该信息!
    • @Sai 这个解决方案应该仍然有效。但是,不要调用getPackageInfo,而是调用getPackageArchiveInfo 并传入APK 的路径。
    • 您通常希望使用 HEX 表示的哈希而不是 Base64 - 请参阅此 stackoverflow.com/questions/2817752/… 了解如何操作
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2013-06-27
    • 2019-06-04
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多