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

时间:2017-05-28 05:45:37

标签: java android android-library dex android-security

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

我要实现的是在运行时以编程方式计算apk(或其重要部分)的校验和,这样我就可以防止重新打包或重新编译的apk能够造成任何伤害(防篡改) )。

到目前为止,我想出的是计算applicationInfo.publicSourceDir的校验和。但我不确定具有多个dex文件或多个splitApks的应用程序会发生什么。

以编程方式基于Android应用程序的代码库计算校验和的最可靠方法是什么?

3 个答案:

答案 0 :(得分:2)

如果您通过游戏分发,可以查看SafetyNet:https://developer.android.com/training/safetynet/index.html

答案 1 :(得分:1)

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

首先,这个问题没有明确的解决方案。任何应用程序都可以被黑客攻击 - 你可以让它变得难以入侵。

这就是为了让它变得困难 -

  1. 加密你的apk - 这样很难找到你的源代码。 引用 - APK to protect apk from reverse engineering - 检查混淆 工具。

  2. 从WebService发送/接收数据时使用数据加密。您可以使用HMAC来保护数据。确保您的服务器足够智能,以阻止用户/请求应用程序,以防多个不良呼叫。 HMAC易于实现,并且有用于生成HMAC密钥的库。

答案 2 :(得分: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;
}

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