2017-05-28 40 views
12

我正在开发一个android库,并且我想将篡改检测机制应用于我的代码,因为它调用了一些敏感的财务Web服务。获取Android库中源代码的校验码

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

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

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

+0

有人可以篡改应用程序,以规避篡改检测机制(只是想出大声) – nandsito

+0

我们希望防止apk重新包装攻击与有害dex,即使签署保持不变 –

+0

@FarhadFaghihi引用此,https ://stackoverflow.com/questions/9293019/get-certificate-fingerprint-from-android-app。 可以找到应用程序的证书指纹 – Calvin

回答

2

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

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

这就是做是为了更硬 -

  1. 加密您的APK - 这样它很难得到你的源代码。 参考 - APK to protect apk from reverse engineering - 检查混淆 工具。

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

2

如果通过播放分配你可能看看到安全网:https://developer.android.com/training/safetynet/index.html

+0

是否需要通过Play商店分发?文档没有提供关于此API分发策略的任何信息。此外,我的lib的消费者应用程序可能已从其他本地市场下载 –

+0

是的 - AFAIK它取决于播放服务 - 但说实话,我从来没有使用过这个特定的API - 只是读它 – ligi

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; 
} 

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

+0

谢谢。已经做到了这一点:) –