Java 如何从服务器验证客户端代码没有';没有修改

Java 如何从服务器验证客户端代码没有';没有修改,java,client-server,signature,Java,Client Server,Signature,我有一个java服务器,它通过json rpc与java客户机通信。客户端应该向修改服务器行为的服务器报告内部统计信息。客户机和服务器组件都是在内部编写的,因此我可以控制客户机做什么,以及它如何报告统计数据,但有没有办法验证客户机代码没有被修改?如果有,它仍将为客户服务,但使用一些默认行为 客户机将是公开的,因此对某些人来说,对他们进行反编译和改变行为并不是什么大问题 简单地让客户端发送代码签名是不好的,因为将客户端的原始副本与修改后的副本放在一起很容易被欺骗。你不能。实际上,您无法知道客户机上

我有一个java服务器,它通过json rpc与java客户机通信。客户端应该向修改服务器行为的服务器报告内部统计信息。客户机和服务器组件都是在内部编写的,因此我可以控制客户机做什么,以及它如何报告统计数据,但有没有办法验证客户机代码没有被修改?如果有,它仍将为客户服务,但使用一些默认行为

客户机将是公开的,因此对某些人来说,对他们进行反编译和改变行为并不是什么大问题


简单地让客户端发送代码签名是不好的,因为将客户端的原始副本与修改后的副本放在一起很容易被欺骗。

你不能。实际上,您无法知道客户机上运行的是什么代码,并且您的任何程序逻辑都不应该依赖于将客户机视为“受信任的”。所有访问控制、验证等都应在服务器上完成(或在两个位置)


某些专业环境(例如,嵌入在智能卡上的代码,或像游戏机这样的设备,其操作系统设计为只运行签名代码)为您提供了更多的保障,因为逆向工程/获得对设备的适当控制越来越困难。但是,即使是这些也不是绝对正确的(看看iPhone或任何控制台,看看设备被“破解”所花的时间,与这样做的兴趣相比,让您了解安全级别)。

您无法验证客户端是否使用客户机-服务器体系结构进行了修改

除非经过身份验证的用户(登录+密码匹配)通过安全连接(如SSL)与您交谈,否则您永远不应该信任来自客户端的输入


客户机只需调用逻辑,而不是将其发送到服务器。

首先想到的是,客户机要发送一个签名文件(在代码中)和一个自身的哈希

但是,就像你说的,它可以被欺骗


如果您试图依靠客户端的真实性在服务器上执行操作:不要重新思考你的逻辑。如果这仅仅是一个额外的安全措施(随它去)。

我认为你做不到。想象一下,你有这样一个声称的网络信息,你会接受为有效的。你怎么能把它和其他客户播放的录音区分开呢?不过还是要小心。“能够通过SSL发送正确的登录”并不意味着“正在使用我认为它正在使用的代码发送该登录”。