【问题标题】:Self-checking an APK's signature自检 APK 的签名
【发布时间】:2012-03-30 19:40:17
【问题描述】:

我想在运行时以编程方式检查 APK 的签名。我在我的开发工作站上拥有一个密钥库,所以我可以知道(不知道如何)我用来签署 APK 的公钥。

一旦我知道签名后的公钥是什么,我想输入源代码并检查当前运行的应用程序是否与密钥匹配。

有可能吗?如果是这样,我如何从 Eclipse 生成的密钥库中获取公钥?

谢谢。

【问题讨论】:

  • 抱歉,这必须离线工作,适用于应用的预览版。我对此有一个相关的问题
  • 从安全的角度来看,自检没有什么意义,因为攻击者可以修改代码以接受任何内容。
  • 没错,但加上混淆只会让攻击者的生活变得更加困难。在我的具体情况下,Android 许可是完全不可行的
  • 我在这里不明白的是,“如果某个黑客能够按照他想要的方式编辑您的 apk”,他不能只删除您正在执行此签名检查的存根(方法)吗?该应用程序甚至不检查任何内容。有意义吗?

标签: android apk digital-signature


【解决方案1】:

你可以试试这个,应该可以的

Signature[] sigs = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
    for (Signature sig : sigs)
    {
        // log the sig here
    }

【讨论】:

  • 在 Playstore 上传后不起作用。在playstore上传之前尝试了apk,它可以工作。但上传后,签名改变了。
  • @TentenPonce 什么是解决方案?上传到 google play 后,您的应用签名发生了变化?
  • @Farzad 仍在寻找其他解决方案,但我们可以尝试发布一个预版本以检查 Playstore 上的签名,然后使用我们从 Playstore 应用程序获得的签名再次重新发布。跨度>
  • @TentenPonce 破坏者能否通过更改 Java 代码来中和此解决方案?
  • @Farzad 是的,他们仍然可以删除检查签名的代码。正如他们所说,安全方面没有灵丹妙药。你只能让它变得困难,但不能完全阻止。
【解决方案2】:

我想我的情况和你一样。 这是我的original solution

你可以试试看。

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
Signature releaseSig = context.getPackageManager().getPackageAchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];
return sig.hashCode() == releaseSig.hashCode;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多