问题描述
我想阻止某人简单地扎根设备并复制应用程序以重新分发。 如何使下载的设备“帐户锁定”?
我的想法是实现一种加密算法(单向),该算法对用户的电话号码进行散列,并且代码的执行每次都会执行散列检查(因此,如果您在手机上使用其他人的应用程序,则会失败)。
但是,由于应用程序的下载方式相同,如果我在第一次启动时实施电话号码散列,攻击者可能永远不会启动应用程序并窃取下载包的基本版本。
所以我的问题是,Google Play 商店中是否有一种方法可以为应用程序提供其中一个已更改的变量? 或者有一个聪明的方法来确保已安装的应用程序在其他任何地方都不起作用,以防止直接复制软件包被盗用? 也许强制首次启动,以便在下载后立即自行配置?
1楼
有一个简短的计算机科学答案,还有一个更长的更有帮助的答案。 简短的回答是“如果您的应用程序依赖于服务器运行,那么这很容易。如果您的应用程序完全在设备上运行,理论上是不可能的。”
如果您的应用程序依赖于服务器,这是一个简单的过程:
- 使用获得由 Google 加密签名的响应,表示此帐户购买了此应用程序。 在应用程序的客户端代码中执行此操作。
- 将该响应发送到您的服务器,并检查签名。 如果不匹配,请不要将所需信息发送到您的应用。
由于用户无法干扰 Google 服务器或您的服务器,并且您的应用需要服务器响应才能运行,因此这是牢不可破的。
但是,如果您检查客户端的响应,或者您的应用程序可以在没有服务器响应的情况下工作(理论上)。 攻击者始终可以删除对 Google Play 的调用、验证码或伪造您的服务器响应。 在这种情况下,您正在与攻击者进行军备竞赛。 大多数攻击者都很懒惰。 如果您使用来检查您的应用是从 Play 购买的,使用 ProGuard 或其他优化器,并进行一些混淆以隐藏您的代码,一些攻击者可以攻击,但大多数不会打扰,除非您的应用/游戏非常受欢迎。 另一项有用的技术是 ,它会告诉您您的应用程序是否已被篡改。 但是同样,如果你不检查结果服务器端它可能会被打败,所以客户端只是一场混淆军备竞赛。
当心,依靠电话号码之类的东西是一个非常糟糕的主意:
- 没有SIM卡的平板电脑怎么办?
- 双卡用户呢?
- 更改电话号码或网络的用户呢?
- 拥有不止一部手机的用户只需要购买一次你的应用程序呢?