【问题标题】:Get checksum of the source codes in Android library获取 Android 库中源代码的校验和
【发布时间】:2017-05-28 05:45:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有人可以通过绕过篡改检测机制的方式篡改应用程序(只是大声思考)
  • 我们要防止带有有害 dex 的 apk 重新打包攻击,即使签名保持不变
  • @FarhadFaghihi 参考这个,stackoverflow.com/questions/9293019/…。可以找到应用程序的证书指纹

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


【解决方案1】:

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

【讨论】:

  • 必须通过 Play 商店分发吗?文档没有说明此 API 的分发策略。此外,我的 lib 的消费者应用程序可能已从其他本地市场下载
  • 是的 - AFAIK 这取决于播放服务 - 但老实说,我自己从未使用过这个特定的 API - 只是在阅读它
【解决方案2】:

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

首先,这个问题没有明确的解决方案。任何应用程序都可能被黑——你可以让它很难被黑。

这是为了让它变得困难 -

  1. 加密您的 apk - 使其难以获取您的源代码。 参考 - APK to protect apk from reverse engineering - 检查混淆 工具。

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

【讨论】:

  • “加密你的 apk” - 这真的很模糊,与代码混淆真的不同。
【解决方案3】:

获取与用于签署 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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多