我正在尝试为基于服务器的应用实施版本无效系统。使用以下模型:
在服务器的一些请求中,客户端添加关键字,如果该密码不在白名单中,则服务器会响应错误,并且应用程序会显示一条消息,警告需要进行市场更新(通常是因为黑客版本或是用于合法版本的密码,但由于破解版本使用相同的代码而被列入黑名单。 为了生成该密码,我想在运行时恢复一个识别编译版本的密钥(如果重新编译apk,那将无法正常工作)
最初我考虑使用由以下代码检索的apk签名:
public static int getSignature() {
try {
Signature sigs[] = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
return sigs[0].hashCode();
} catch (NameNotFoundException ignore) {
}
return 0;
}
但是非常愚蠢,因为黑客可以检索我的apk的签名(将其安装在设备中并使用上面的代码运行程序(使用my.apk.package名称而不是getPackageName())
然后修改getSignature()方法以返回伪造代码而不是真实签名。
所以我的问题是,如果有某种信息(签名依赖或类似)但不能从应用程序外部轻松访问,那么如果使用另一个签名重新编译代码,那么值会被更改,并且不能轻易地猜猜
由于
答案 0 :(得分:2)
如果您的应用是付费应用,您可能需要查看: http://developer.android.com/guide/publishing/licensing.html
这可能是一个长篇阅读和一些工作,但嘿,这是安全的代价。
答案 1 :(得分:2)
我认为你运气不好,因为几乎每个人都可以阅读.apk中的任何,尤其是在有根设备上。
您一定要考虑对您的应用进行模糊处理,例如:使用ProGuard。