客户端服务器:如何使客户端更难以修改其源代码

时间:2020-06-11 13:40:55

标签: security language-agnostic client-server handshake

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

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

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

我有三个问题:

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

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

  • 在不使用IP地址的情况下,客户端如何才能知道来自服务器而不是另一个客户端的请求?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

如何相对确定用户正在运行程序的最新版本?

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

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

您实际上可以正确执行此操作。让服务器使用其私钥对发送的消息进行签名,并让客户端使用服务器的公钥(客户端源代码可以包含该签名)来验证签名。由于只有您的服务器才可能使用正确的私钥对邮件进行签名,因此客户端可以确信使用相应的公钥成功意味着您的服务器已发送了邮件。

答案 1 :(得分:0)

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

因此,在更好的体系结构中,您可以在设备上连接的Internet上获得服务。请注意,这些连接也可以是长连接,而不必只是典型的短暂http连接。

您的用户可以随意修改设备上运行的客户端软件,或者他们可以创建其他客户端,您对此无能为力。实际上,除非出于某种原因这非常有价值,否则没有人会打扰,尤其是以商业方式,因为对您的api所做的任何更改都会破坏第三方客户端。仍然使客户端代码更难修改的一个选项是混淆,但是请注意,它并不是真正的安全功能,但是确实增加了必要的工作。

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

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

相关问题