我正在开发一个Android库,我想在我的代码中应用篡改检测机制,因为它调用了一些敏感的金融Web服务。
我要实现的是在运行时以编程方式计算apk(或其重要部分)的校验和,这样我就可以防止重新打包或重新编译的apk能够造成任何伤害(防篡改) )。
到目前为止,我想出的是计算applicationInfo.publicSourceDir
的校验和。但我不确定具有多个dex文件或多个splitApks的应用程序会发生什么。
以编程方式基于Android应用程序的代码库计算校验和的最可靠方法是什么?
答案 0 :(得分:2)
如果您通过游戏分发,可以查看SafetyNet:https://developer.android.com/training/safetynet/index.html
答案 1 :(得分:1)
校验和方法可以应用于单个文件或zip文件。检查所有文件的校验和将是一个漫长的过程。我认为你的方向错了。
首先,这个问题没有明确的解决方案。任何应用程序都可以被黑客攻击 - 你可以让它变得难以入侵。
这就是为了让它变得困难 -
加密你的apk - 这样很难找到你的源代码。 引用 - APK to protect apk from reverse engineering - 检查混淆 工具。
从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;
}
可以将其与存储值进行比较,以检查签名证书是否为原始证书。