Java 防止来自非法客户端的连接
我有一个Java的客户机/服务器设置。客户端当前将计算值传输到服务器(除了登录/密码之外,还通过套接字)以进行身份验证 然而,目前没有任何东西可以阻止恶意反编译和重构的客户机连接,因为它只需要发送相同的身份验证数据Java 防止来自非法客户端的连接,java,security,Java,Security,我有一个Java的客户机/服务器设置。客户端当前将计算值传输到服务器(除了登录/密码之外,还通过套接字)以进行身份验证 然而,目前没有任何东西可以阻止恶意反编译和重构的客户机连接,因为它只需要发送相同的身份验证数据 鉴于反编译揭示了我的客户机正在做的一切,真的有什么方法可以合理地阻止来自修改过的客户机的连接吗?在我看来,实现这一点的唯一方法是生成一个唯一的令牌,而经过修改的客户端(具有相同的令牌生成逻辑)在某种程度上无法生成该令牌。您无法真正避免假客户端(看看专有软件/协议是如何进行反向工程的)
鉴于反编译揭示了我的客户机正在做的一切,真的有什么方法可以合理地阻止来自修改过的客户机的连接吗?在我看来,实现这一点的唯一方法是生成一个唯一的令牌,而经过修改的客户端(具有相同的令牌生成逻辑)在某种程度上无法生成该令牌。您无法真正避免假客户端(看看专有软件/协议是如何进行反向工程的),但是这没有问题,因为你应该永远不要信任客户:检查他提出的每一个请求,这样他就不会引起问题。如果你这样做,即使是一个假客户也必须遵守你的规则,根本不会成为问题
无论如何,另一种方法是使你使用的协议变得模糊,这样它就不容易被反编译,协议也不可能被反向工程,但是你会惊讶于某些人能够破坏你的行为。让你的代码变得晦涩难懂很少是一个好处,而且会让你在大部分时间里浪费时间。SO俱乐部的规则1:永远不要相信客户“它需要做的只是发送相同的身份验证数据”——但它怎么知道用户名和密码呢?或者那些硬编码也在客户端软件中?@Arjan注册帐户是免费的,因此用户名和密码不受严格控制/颁发。您描述了消息身份验证代码。但是,@Marcus,如何在应用程序中隐藏MAC的密钥?理想情况下是的,但是,有太多可能的命令/行为交互,因此在服务器端对所有请求进行监控要比混淆工作耗时得多。目前,只有最关键和最明显的行为才会被合法性审查。我不知道您想要开发哪种服务器,但通常这不是问题