android 签名验证防止重打包

1 java 代码中验证签名

用 PackageManager 获取签名信息

public static int getSignature(Context context) {
    PackageManager pm = context.getPackageManager();
    PackageInfo pi;
    StringBuilder sb = new StringBuilder();
    
    try {
        pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
        Signature[] signatures = pi.signatures;
        for (Signature signature : signatures) {
            sb.append(signature.toCharsString());
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    return sb.toString().hashCode();
}

 

这种纯粹的字符比较都很容易破解掉,直接在 smali 中全局搜索干掉或修改你的签名验证逻辑就行了,实际上用处不大。

2 签名验证放到 native 层用 NDK 开发
这种验证稍微安全了一点,毕竟能逆向 C 和 C++ 的人要少一些。像我这种现在还不能逆向C的就无能为力了。
但对于能逆向C的同学来说,也是很轻易的就改掉你的验证逻辑,可以考虑加上,毕竟还是有点用的。
3 验证放到服务端
感觉没什么鸟用,直接干掉或修改你接口的判断逻辑的就行了。

还有很多高级方法可以直接绕过签名验证,还待研究。

 

爱编程
  • 本文由 发表于 2015-02-2618:07:45