我正在开发一款Android库,想要在我的代码中应用篡改检测机制,因为它调用了一些敏感的金融Web服务。
我要实现的是在运行时对apk(或其中重要部分)进行程序化计算校验和,以便防止重新打包或重新编译的apk造成任何损害(防篡改)。
目前我想到的方法是对applicationInfo.publicSourceDir
的校验和进行计算。但我不确定对于有多个dex文件或多个分割apk的应用程序会发生什么情况。
在Android应用程序的代码基础上,程序化地计算校验和最可靠的方法是什么?
我正在开发一款Android库,想要在我的代码中应用篡改检测机制,因为它调用了一些敏感的金融Web服务。
我要实现的是在运行时对apk(或其中重要部分)进行程序化计算校验和,以便防止重新打包或重新编译的apk造成任何损害(防篡改)。
目前我想到的方法是对applicationInfo.publicSourceDir
的校验和进行计算。但我不确定对于有多个dex文件或多个分割apk的应用程序会发生什么情况。
在Android应用程序的代码基础上,程序化地计算校验和最可靠的方法是什么?
校验和方法可以应用于单个文件或zip文件。检查所有文件的校验和将是一个冗长的过程。我认为你走错了方向。
首先,没有明确的解决方案。任何应用程序都可能被黑客攻击--你只能让它难以被攻击。
以下是让它难以被攻击的方法 -
加密你的 APK -- 这样就很难获取你的源代码了。参考 APK to protect apk from reverse engineering - 检查混淆工具。
在从 WebService 发送/接收数据时使用数据加密。您可以使用 HMAC 来保护数据。确保您的服务器足够聪明,在有多个恶意调用时阻止用户/请求应用程序。HMAC 容易实现,并且有库可以生成 HMAC 密钥。
获取应用程序签名,该签名与用于签署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;
}
这可以与存储的值进行比较,以检查签名证书是否为原始证书。