如何避免APK被非原密钥库/证书签名?
关于React Native Android应用防非原证书重签名的解答
你无法直接阻止攻击者使用非原发布证书给篡改后的APK完成签名流程,但可以通过多重防护手段让被重签名的APK无法正常运行。
- 核心逻辑说明:Android的APK签名工具是公开通用工具,本身允许任意用户持任意密钥给APK完成签名操作,这个流程不受原开发者控制,不可能从底层阻断他人的签名行为。
- 可行防护方案:
- 应用内签名校验:在Android原生层(Java/Kotlin)添加启动校验逻辑,读取当前应用的签名SHA256指纹,和你提前硬编码在代码里的原证书指纹做对比,一旦不匹配直接闪退、清空本地数据或者拒绝所有功能调用。示例代码片段:
// 实际使用建议拆分逻辑、做混淆处理,避免被攻击者直接定位删除 public String getCurrentSignature(Context context) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; MessageDigest md = MessageDigest.getInstance("SHA256"); md.update(signatures[0].toByteArray()); byte[] digest = md.digest(); StringBuilder toHex = new StringBuilder(); for (byte b : digest) { String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) toHex.append('0'); toHex.append(hex); } return toHex.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } } - 代码混淆与加固:开启Android Studio自带的R8混淆,把签名校验的相关逻辑拆分到多个类中分散调用,避免被攻击者直接定位删除。条件允许的话可以对接商用Android应用加壳服务,进一步提高逆向破解的成本。
- 分发渠道校验:如果应用主要在Google Play分发,可以接入Play Integrity API校验应用签名是否和官方分发的一致;如果是国内渠道分发,可以接入对应渠道的应用合法性校验服务。
- 应用内签名校验:在Android原生层(Java/Kotlin)添加启动校验逻辑,读取当前应用的签名SHA256指纹,和你提前硬编码在代码里的原证书指纹做对比,一旦不匹配直接闪退、清空本地数据或者拒绝所有功能调用。示例代码片段:
- 补充说明:所有防护手段都只能提高破解门槛,无法100%阻挡技术能力极强的攻击者,但足以拦截90%以上的普通篡改重签名行为。
内容的提问来源于stack exchange,提问作者Suyash Gaonkar
相关产品推荐
相关产品推荐

