我正在用java做一个项目,我希望能够从客户端收集统计数据,我担心会发生的一个可能问题是对用于收集的变量的操作,这将导致非法统计数据。是否有可能以任何方式防止对变量的操纵,或者总是有可能?
例如:我想记录客户端每小时执行的操作。作为执行动作数量的计数器的变量被操纵,并且更大的数量被添加到计数器中。然后将此数据上传到服务器(当然使用多层架构来防止更多可能的问题)并被认为是“合法的”。
有什么办法可以防止这种情况发生吗?
我正在用java做一个项目,我希望能够从客户端收集统计数据,我担心会发生的一个可能问题是对用于收集的变量的操作,这将导致非法统计数据。是否有可能以任何方式防止对变量的操纵,或者总是有可能?
例如:我想记录客户端每小时执行的操作。作为执行动作数量的计数器的变量被操纵,并且更大的数量被添加到计数器中。然后将此数据上传到服务器(当然使用多层架构来防止更多可能的问题)并被认为是“合法的”。
有什么办法可以防止这种情况发生吗?
根据上传数据的方式,有多种方法可以保护信息。
如果您要上传某种文本或数据文件,使用基本加密,即使是带有密码的 ZIP,应该足以阻止临时用户更改信息。
您的应用程序也可以简单地使用 RMI 或 Web 服务来上传信息,而不需要用户更改来操作数据。
当然,所有这些都假设应用程序本身收集信息——如果用户有机会输入数据,则没有真正的方法可以防止他们向您提供虚假信息。
在不知道这是桌面应用程序还是 Web 应用程序的情况下,我建议您以某种方式加密您的上传文件。它不必很复杂,只要有人无法在文本编辑器中对其进行编辑即可。
请记住,如果某些东西在客户端机器上运行,它是可以被操纵的。Java 不是一种安全的语言,就这点而言,什么都不是,虽然你可以做很多事情来保护应用程序,但总会有人比它更聪明一点,可以破解它。
如果我这样做,我会在受保护的机器上累积统计信息。让主要数据收集代码向累加器发送“事件”消息,并让累加器记录原始事件及其到达时间戳。这不会阻止人们操纵统计数据,但它可以使事后更容易检测可疑模式。
基于这个想法,您可以安排事件生成器应用程序(在用户的计算机上)使用某种涉及共享密钥或公钥/私钥加密的握手。我认为您不能完全确保这一点,但隐匿性安全可能足以应对没有对代码进行逆向工程技能的人的作弊企图。
但就像 Ewald 所说,任何算法过程都可以由对其运行的硬件有足够控制权的人进行逆向工程。如果这个过程需要使用一个“秘密”来运行,那么这个秘密就可以被泄露。