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

问题描述 投票:1回答:2

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

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

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

我有三个问题:

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

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

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

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

security language-agnostic client-server handshake
2个回答
0
投票

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

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

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

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

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

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

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.