如何让一个App设备专用(设备/账号锁)?

How to make an App device specific (device / account lock)?

我想防止有人简单地对设备进行 root 操作并复制应用程序以重新分发。如何制作下载的设备"account locked"?

我的想法是实现一种加密算法(单向),对用户的 phone 号码进行哈希处理,代码的执行每次都会执行哈希检查(所以如果你使用某人,它会失败phone).

上其他人的应用

但是,由于应用程序的下载方式相同,如果我在首次启动时实施 phone 数字散列,攻击者根本无法启动该应用程序并窃取下载包的基础版本。

所以我的问题是 Google Play 商店中是否有一种方法可以为应用程序提供其中一个变量已更改?还是确保已安装的应用程序在其他任何地方都无法运行以防止直接复制包被窃取的聪明方法?也许强制首次启动以便它在下载后立即自行配置?

有一个简短的计算机科学答案,还有一个更长更有用的答案。简短的回答是 "If your app relies on a server to run, then it is easy. If your app runs entirely on the device it is theoretically impossible."

如果您的应用程序依赖于服务器,这是一个简单的过程:

  1. 使用 Google Play License Verification Library (LVL) 获得由 Google 加密签名的响应,表明此帐户购​​买了此应用程序。在应用程序的客户端代码中执行此操作。
  2. 将该响应发送到您的服务器,并检查签名。如果不匹配,请不要将所需信息发送到您的应用程序。

因为用户不能干扰 Google 服务器或您的服务器,并且您的应用程序需要服务器响应才能运行,所以这是牢不可破的。

但是,如果您检查客户端的响应,或者您的应用程序可以在没有服务器响应的情况下工作,这是无法完成的(理论上)。攻击者始终可以删除对 Google Play 的调用、验证码或伪造您的服务器响应。 在这种情况下,您正在与攻击者进行军备竞赛。大多数攻击者都非常懒惰。如果您使用 Google Play License Verification Library (LVL) 检查您的应用程序是从 Play 购买的,使用 ProGuard 或其他优化器,并进行一些混淆以隐藏您的代码,一些攻击者可以攻击,但大多数人不会打扰,除非您的 app/game超人气。另一项有用的技术是 SafetyNet 证明 API,它会告诉您您的应用程序是否已被篡改。但是同样,如果您不检查服务器端的结果,它可能会被击败,所以客户端只是一场混淆军备竞赛。

注意,依赖 phone 数字是一个非常糟糕的主意:

  • 没有 SIM 卡的平板电脑怎么办?
  • 使用双 SIM 卡的用户呢?
  • 更改 phone 号码或网络的用户怎么办?
  • 那些拥有多个 phone 且只需要购买您的应用一次的用户呢?