2013-03-05 15:12:11
分享

防止非法拷贝 给自己的软件上把锁

标签:非法拷贝,软件

  下面的部分是对官方的技术文档“Licensing Your Applications”一些重要内容的摘要,希望有助于已经或者正在开发 Android 收费应用的开发者更清晰了解该服务并使用它来为自己的应用提供防拷贝保护。

  • 要使用该许可认证服务,你必须是菜市场的注册开发者,而且你的收费应用也必须通过菜市场提供。(呵,这也是 Google 打击其它各式各样的山寨安卓市场的重要手段啊,一旦它们无法提供破解的收费应用,并因为缺少像 Google 这样的防拷贝机制,也很难吸引到收费应用的开发者进驻,只能提供一些简单的免费应用的话,对用户的吸引力自然大大减少)。

  Android Market Licensing Service

  • 并且运行的设备上必须安装了 Market App,因为3rd App 不能直接跟 Google 的验证服务器通信,而必须通过 Market App 进行。当然,要从菜市场购买 Apps,Market App 本来就是必不可少的。Maket App 会自动获取你的 App 的 ID 和当前用户的帐号数据并把它们打包传送到服务器上进行验证。并把验证的结果返回给你的 App。此外对 Android OS 的版本要求是1.5以上。除了以上两点,任意类型的 App 可以在任意设备上使用该服务

  LVL

  • Google 提供了 LVL (License Verify Library 许可验证库)来帮助你处理如何向 Market App 发起许可验证的请求,并把服务器回应的数据通过你注册的回调函数返回给你的 Activity。(LVL 可以通过 Android SDK and AVD Manager 下载)

  public key

  • Google 的许可验证服务器返回的验证结果是加密的,以防止第三方伪造验证结果。加密所用的公钥可以在你的注册开发者帐号管理里面申请。你需要把申请的公钥传给 LVL 相应的接口,LVL 会自动使用该公钥去解密验证结果,并把结果的明文返回给你的 Activity。

  • 验证失败的情况下要如何处理,施加那些约束或者是否直接退出由开发者自行决定。你可以根据应用的类型,面向的用户等来决定。

  • LVL 提供了 Policy 接口和内置的 ServerManagedPolicy 实现(Google 强烈推荐使用该内置实现)来帮助处理无法联网验证失败下的状况。ServerManagedPolicy 会缓存验证结果到本地文件,并设置一定的有效期限,这样就可以避免每次查询都需要链接服务器。

  ...

  // Construct the LicenseChecker with a Policy.

  mChecker = new LicenseChecker(

  this, new ServerManagedPolicy(this,

  new AESObfuscator(SALT, getPackageName(), deviceId)),

  BASE64_PUBLIC_KEY // Your public licensing key.

  );

  ...

  • 被缓存到本地的验证结果可以通过LVL提供的一个Obfuscator 接口进行混淆加密,LVL 内置提供了一个 AESObfuscator 实现,AES公钥可以通过预设的种子,应用 ID和设备ID产生,要破解缓存的验证结果也将会非常困难。

  • Google 建议你对你的收费应用程序也使用混淆器如 ProGuard 做代码混淆,避免被人直接破解程序(比如修改验证的代码)。

  • Google 提供了完善的测试环境,允许你事先测试验证成功,验证失败等各种状况。

  • 如果已经使用了该许可验证服务,在发布应用时,就不要再设置防拷贝选项(In the Publishing options section, make sure that the Copy Protection radio button selection is “Off”)。

  当前在 Android 生态系统中,获得最大收益的还是设备供应商,或者电信运营商,而作为在这个系统中扮演最重要角色的开发社区,它们所能得到的回报还是十分可怜,而 Google 为开发者提供的许可验证服务将有助于改善这一点。