获取Android库中源代码的校验和

15

我正在开发一款Android库,想要在我的代码中应用篡改检测机制,因为它调用了一些敏感的金融Web服务。

我要实现的是在运行时对apk(或其中重要部分)进行程序化计算校验和,以便防止重新打包或重新编译的apk造成任何损害(防篡改)。

目前我想到的方法是对applicationInfo.publicSourceDir的校验和进行计算。但我不确定对于有多个dex文件或多个分割apk的应用程序会发生什么情况。

在Android应用程序的代码基础上,程序化地计算校验和最可靠的方法是什么?


有人可以通过某种方式篡改应用程序,从而规避篡改检测机制(只是随口一说)。 - nandsito
我们希望防止 APK 重打包攻击,即使签名保持不变,也能防止有害 dex。 - Farhad
@FarhadFaghihi 可以参考这个链接:https://dev59.com/32ox5IYBdhLWcg3wTina。 可以找到应用程序的证书指纹。 - Calvin
3个回答

2

通过 Play 商店分发是强制性的吗?该 API 的文档没有说明分发政策。此外,我的库的消费者应用程序可能已从其他本地市场下载。 - Farhad
是的 - 就我所知,它取决于play-services - 但说实话,我从未使用过这个特定的API - 只是在阅读相关内容。 - ligi

1

校验和方法可以应用于单个文件或zip文件。检查所有文件的校验和将是一个冗长的过程。我认为你走错了方向。

首先,没有明确的解决方案。任何应用程序都可能被黑客攻击--你只能让它难以被攻击。

以下是让它难以被攻击的方法 -

  1. 加密你的 APK -- 这样就很难获取你的源代码了。参考 APK to protect apk from reverse engineering - 检查混淆工具。

  2. 在从 WebService 发送/接收数据时使用数据加密。您可以使用 HMAC 来保护数据。确保您的服务器足够聪明,在有多个恶意调用时阻止用户/请求应用程序。HMAC 容易实现,并且有库可以生成 HMAC 密钥。


加密你的apk - 这与代码混淆非常不同,而且非常模糊。 - GMX

0

获取应用程序签名,该签名与用于签署APK的证书相关联。

public static String getAppSignature(Context context) {
    try {
        for (Signature signature : context.getPackageManager().getPackageInfo(context.getPackageName(),
                PackageManager.GET_SIGNATURES).signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.DEFAULT);
        }
    } catch (Exception e) { /* Do nothing */ }
    return null;
}

这可以与存储的值进行比较,以检查签名证书是否为原始证书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接