根据apk签名检索一些信息

时间:2011-12-31 17:03:38

标签: android licensing

我正在尝试为基于服务器的应用实施版本无效系统。使用以下模型:

在服务器的一些请求中,客户端添加关键字,如果该密码不在白名单中,则服务器会响应错误,并且应用程序会显示一条消息,警告需要进行市场更新(通常是因为黑客版本或是用于合法版本的密码,但由于破解版本使用相同的代码而被列入黑名单。 为了生成该密码,我想在运行时恢复一个识别编译版本的密钥(如果重新编译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()方法以返回伪造代码而不是真实签名。

所以我的问题是,如果有某种信息(签名依赖或类似)但不能从应用程序外部轻松访问,那么如果使用另一个签名重新编译代码,那么值会被更改,并且不能轻易地猜猜

由于

2 个答案:

答案 0 :(得分:2)

如果您的应用是付费应用,您可能需要查看: http://developer.android.com/guide/publishing/licensing.html

这可能是一个长篇阅读和一些工作,但嘿,这是安全的代价。

答案 1 :(得分:2)

我认为你运气不好,因为几乎每个人都可以阅读.apk中的任何,尤其是在有根设备上。

您一定要考虑对您的应用进行模糊处理,例如:使用ProGuard。