在 iOS 中,让未知应用程序远离您的服务器的标准方法是什么?

In iOS what is the standard way to keep unknown Apps off your server?

应用程序可以有一个硬编码的私钥,我的服务器可以有它的 public,应用程序可以签署所有内容。但是随后黑客可以识别目标代码中的私钥并编写一个恶意应用程序,该应用程序使用相同的密钥对所有内容进行签名。然后那个应用程序可以使用我的服务器。

应用程序可以与我的服务器进行密钥交换,但是服务器在进行密钥交换时如何知道应用程序是真实的?

本质上你无法知道。

原因很简单:因为任何人都可以找到客户并拥有一切客户是并且通过逆向工程了解客户(他们拥有他们需要执行的所有内容) ),没有什么可以阻止他们回答您可能设置为真实应用程序会回答的任何挑战。

不过,您可以加大假冒应用的难度。但他们无论如何都可以(如果做得对)给出答案。

例如如何让它变得更难: 服务器向客户端应用程序发送挑战以计算例如从给定的开始到给定的结束,应用程序本身的 CRC32(或 md5、sha-1、sha-256 等无关紧要)。如果您将这些起点和终点设置为对于您发送的每个挑战都是完全随机的,那么您实际上是在迫使假应用程序拥有完整的真实应用程序的编译代码……因此您承担了必须拥有真实应用程序的负担(不是强制它实际上是运行宁(未修改的)代码,只是具有实际的未修改代码)。 请注意,您需要支持服务器端并允许多个版本的客户端等,否则您将无法再升级客户端。

因此,分发假冒应用程序的任何人都将被迫侵犯您对真实应用程序的版权(您的律师可能会处理更简单的案子)。

备选方案:

要选择一个替代方案,您需要弄清楚为什么让您的客户(如此)重要?

如果客户端包含机密:删除它们,使客户端仅显示并拥有一个 3 层模型,您只让用户 运行 显示部分并将所有机密保存在您的服务器上。

如果您通过销售应用程序获得收入,请免费赠送并出售您服务器上的帐户。使用身份验证来做到这一点:您可以对用户进行身份验证(登录名和密码,真正的 2 因素身份验证,......)你也可以禁止他们在短时间内显着改变他们的地理位置,禁止同时登录,...... 但价格是用户跳过的铁环。尽管如此,他们可能会使用其他客户。

如果您允许逻辑(例如在线游戏中使用的逻辑)使用用户 CPU 的力量来做事,您仍然可以在服务器上保持对逻辑级别的监督:例如如果在真实客户端中完成一项任务至少需要 5 分钟,并且如果客户端在这 5 分钟完成之前报告为 "achieved":你有一个作弊者......同样,确保所有重要资产仅由服务器提供,不要相信客户端...