我对app开发特别陌生,最近了解到apk的整个签名过程,为什么它是强制性的,以及防止应用程序未经授权和篡改的重要性。著名的签名检查之一是使用PackageManager类进行签名验证。有没有其他方法可以检查apk本身的META-INF目录中的篡改或其他滥用行为,以验证应用程序没有被篡改,并且原始签名完好无损?
发布于 2018-12-04 16:18:08
此代码获取Classes.dex文件的CRC校验和,并将其与提供的校验和进行比较。
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;
}
}发布于 2020-04-10 21:21:17
最佳做法是无法打补丁的服务器端篡改检测。
下面是如何实现的:
使用Android SafetyNet。这就是Android Pay自我验证的方式。
基本流程是:
Play
如果这通过了,你可以相当有信心地相信,用户正在未经修改的系统上运行你的应用程序的正版。应用程序应该在启动时获得认证,并在每次事务请求时将其发送到您的服务器。
但请注意,这意味着:
安装了自定义或第三方只读存储器/固件/操作系统的
因此,...and将无法使用您的应用程序。您的公司需要做出业务决策,决定这些限制(以及随之而来的令人不快的用户)是否可以接受。
最后,要认识到这并不是一个完全无懈可击的解决方案。有了超级用户访问权限和Xposed,就有可能修改SafetyNet库来欺骗谷歌的服务器,告诉它们“正确”的答案,以获得谷歌签名的验证通过结果。实际上,SafetyNet只是移动了球门柱,使恶意攻击者更难做到这一点。由于这些检查最终必须在您无法控制的设备上运行,因此设计一个完全安全的系统确实是不可能的。
Read an excellent analysis of how the internals of SafetyNet work here.
https://stackoverflow.com/questions/50126775
复制相似问题