Android APK签名是否会被篡改?用签名做应用核心安全验证是否可行?
其他应用能否读取应用签名的
toString()格式内容 可以,这类信息属于公开可获取的范畴:
- Android 系统提供公开API可供任意应用查询已安装应用的签名:调用
PackageManager的getPackageInfo()方法,传入GET_SIGNATURES(Android 9及以下)或GET_SIGNING_CERTIFICATES(Android 10及以上)标记,就能获取对应包名应用的签名证书数组,调用toString()即可得到和你自有应用内获取的完全一致的格式内容。Android 11及以上引入了包可见性限制,破解者仅需在工具的Manifest中声明目标应用包名即可绕过,不影响签名获取。 - iOS 非越狱设备上其他应用无法直接读取你应用的签名,但越狱设备可直接从系统安装目录读取签名证书文件,同样可以得到对应的字符串内容。
把应用签名作为核心安全验证存在极高被破解风险
这种方式完全不适合作为核心安全校验手段,常见破解路径如下:
- 破解者可直接反编译安装包,定位到签名校验的代码块,直接删除或篡改校验逻辑,让校验永远返回通过状态
- 破解者可Hook你应用获取系统签名的API,将返回值直接替换为你预设的合法签名值,哪怕应用被重签名,校验逻辑也不会触发
- 签名本身是公开可获取的信息,破解者不需要对你的应用做任何逆向,就能直接拿到合法签名值,硬编码到破解版本中即可绕过校验
可实现反编译/篡改后应用自动失效的密钥方案
目前不存在完全无法被反编译查看的本地存储密钥,你可以通过以下组合方案大幅提升破解成本,接近预期效果:
- 调用系统原生的*KeyStore(Android)/钥匙串(iOS)*能力生成密钥,密钥生成后存储在系统安全分区,无法被导出,哪怕应用被反编译也拿不到密钥明文。应用被重签名后将失去访问原有KeyStore/钥匙串串口的权限,自然无法读取密钥,业务逻辑直接失效。
- 采用完整性校验+服务端绑定的方案:把应用签名哈希、安装包整包哈希、设备唯一标识三者绑定后上传到服务端做校验,服务端判定参数不合法就直接拒绝返回所有核心业务数据,本地校验逻辑要配合代码混淆、加固加壳处理,避免被直接抹除。
- 采用白盒加密算法把密钥和加密逻辑深度绑定,密钥不会明文出现在安装包中,但该方案仅能提升破解成本,仍无法完全避免被动态调试提取密钥。
注意:所有本地侧的安全方案都只能提升破解门槛,不存在绝对无法破解的本地防护,核心安全校验逻辑尽量放到服务端实现,才能最大程度降低被破解的风险。
内容的提问来源于stack exchange,提问作者LIGHTNING RED DRAGON GAMING
相关产品推荐
相关产品推荐

