我对App开发特别陌生,并且最近了解了apk的整个签名过程,为什么它是强制性的,并且防止未经授权和篡改应用程序非常重要。 Signature的一个着名检查是使用PackageManager类进行签名验证。有没有其他方法可以检查apk本身中的META-INF目录是否存在篡改或其他滥用活动,以验证应用程序是否未被篡改且原始签名完好无损?
答案 0 :(得分:0)
private void crcTest() throws IOException {
boolean modified = false;
// required dex crc value stored as a text string.
// it could be any invisible layout element
long dexCrc = Long.parseLong(Main.MyContext.getString(R.string.dex_crc));
ZipFile zf = new ZipFile(Main.MyContext.getPackageCodePath());
ZipEntry ze = zf.getEntry("classes.dex");
if ( ze.getCrc() != dexCrc ) {
// dex has been modified
modified = true;
}
else {
// dex not tampered with
modified = false;
}
}
答案 1 :(得分:0)
最佳实践是服务器端篡改检测,该补丁无法修补。
方法如下:
使用Android SafetyNet。这就是Android Pay进行自我验证的方式。
基本流程是:
如果通过,您可以完全确定该用户正在未修改的系统上运行应用程序的正版版本。该应用程序启动时应获得证明,并随每个交易请求将其发送给您的服务器。
请注意,这意味着:
已将手机扎根的用户不会通过这些检查 安装了自定义或第三方ROM /固件/操作系统(例如Cyanogen)的用户将无法通过这些检查
无权访问Google Play服务的用户(例如Amazon) 设备,在中国的人)将无法通过这些检查
...,因此将无法使用您的应用。您的公司需要就是否可以接受这些限制(以及伴随的沮丧用户)做出业务决策。
最后,意识到这不是一个完全密封的解决方案。借助root用户访问权限(可能是Xposed),可以修改SafetyNet库以使其位于Google的服务器上,告诉它们“正确”的答案以获得Google签署的验证通过结果。实际上,SafetyNet只是移动球门柱,使恶意行为者更难。由于这些检查最终必须在您无法控制的设备上运行,因此设计完全安全的系统确实是不可能的。
Read an excellent analysis of how the internals of SafetyNet work here.