【问题标题】:Client Server: How to make it more difficult for client to modify their source code客户端服务器:如何让客户端更难修改其源代码
【发布时间】:2020-06-11 13:40:55
【问题描述】:

我有一个虚构的程序,已分发给数十个客户,其中涉及他们的家用恒温器。该脚本执行两项任务:

  • 当收到来自我的服务器的请求时,脚本会将用户恒温器的温度修改为指定温度。
  • 当收到来自我的服务器的请求时,脚本将回复恒温器的当前设定温度。

在客户端计算机上运行的程序是用脚本语言编写的,未编译。源代码可以随时修改,新修改的脚本可以随意重新运行。

我有三个问题:

  • 我可以对客户端计算机上运行的脚本和/或我的服务器上运行的程序进行哪些更改,以便我更加确信用户没有篡改脚本的源代码?

  • 如何相对确定用户运行的是我的程序的最新版本?

  • 不使用 IP 地址,客户端如何知道请求来自服务器而不是其他客户端?

我了解在客户端 PC 上运行的代码是无法监管的。但是,我想让某人修改我的脚本的源代码变得不那么简单。

【问题讨论】:

  • 是什么杀死了 OpenSource /Libre Philosophies ?

标签: security language-agnostic client-server handshake


【解决方案1】:

正如您正确指出的那样,不可能保证没有人修改您的源代码 - 或者用他们从头开始编写的完全不同的源代码替换您的客户端。它根本无法完成,甚至不是因为您的客户端是作为脚本实现的;二进制文件也可以被替换/欺骗。

我可以对客户端计算机上运行的脚本和/或我的服务器上运行的程序进行哪些更改,以便我更加确信用户没有篡改脚本的源代码?

让您的脚本计算其自己的源代码的加密安全哈希并将该哈希发送到服务器。您将知道客户源代码的哈希值是什么,并且可以确保它是相同的。这并不能保证客户端不会假装在运行您的源代码(他们可以计算客户端的哈希值并在完全运行其他代码时发送它),但这将防止对脚本的随意和/或意外修改(即它保证任何欺骗都是故意的)。

我怎样才能相对确定用户正在运行我的程序的最新版本?

在您分发的客户端源代码中包含一个版本号,这样您就可以保证每个新版本都具有几乎 100% 的概率具有唯一的哈希值。然后,您可以拥有具有相应客户端哈希的版本历史记录。

如果不使用 IP 地址,客户端如何知道请求来自服务器而不是另一个客户端?

你实际上可以正确地做到这一点。让您的服务器使用其私钥对它发送的消息进行签名,并让您的客户端使用您服务器的公钥(客户端源代码可以包含该公钥)验证签名。由于只有您的服务器可能使用正确的私钥对消息进行签名,因此客户端可以确信使用相应公钥的成功意味着您的服务器发送了消息。

【讨论】:

    【解决方案2】:

    如果是家用恒温器,整个架构很可能是错误的。您的服务器将无法连接到客户家庭网络上的设备(或者至少他们必须执行您不应该完成的配置)。

    因此,在更好的架构中,您可以在互联网上提供您的服务,您的设备可以连接到互联网上。请注意,这些连接也可以是长连接,不一定只是典型的短期 http 连接。

    你的用户可以任意修改设备上运行的客户端软件,也可以制作其他客户端,你对此无能为力。实际上,除非出于某种原因这非常有价值,否则没有人会打扰,尤其是在商业方面,因为对您的 api 的任何更改都会破坏 3rd 方客户端。仍然使客户端代码更难修改的一种选择是混淆,但请注意,它并不是真正的安全功能,但确实会增加必要的工作量。

    检查客户端的版本很简单,它可以随请求一起发送。但是,实现我认为您想要的通常方法是对您的 API 进行版本控制。您可能并不关心客户端的确切版本,但您确实关心它支持的服务版本(API)。如果这是您的目标,请查看 API 版本控制。

    如果通信使用 TLS,则在此架构中对服务器进行身份验证很简单。使用 TLS(例如 https),服务器身份验证是隐式的。不过,您仍然希望对客户端进行身份验证,这可以通过标准方式、用户名密码、令牌或客户端证书来完成。在谈论设备时,您可能需要考虑带有 TPM 芯片的设备,以便它可以安全地保存机密,但您是否需要这取决于确切的场景和您的威胁模型(谁将拥有物理访问权限,如果他们可以访问会发生什么)冒充其他设备等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多