如果您担心加密服务器上的数据,那么最简单的解决方案是像Truecrypt这样的全分区加密程序- 如果有人窃取机器/硬盘驱动器,这将保护服务器数据。
如果您在客户端机器上加密数据,那么这意味着加密密钥也必须在客户端机器上的某个位置(即使它在主内存中)。继续对日志信息进行加密或混淆,以使用户更难以阅读它,但请注意,如果用户付出足够的努力,他仍然能够阅读它。也就是说,混淆数据的最佳方法是使用永远不会保存到磁盘的密钥对其进行加密——例如,当用户登录时,向他们发送一个新的加密密钥,他们的客户端应用程序将使用该密钥来加密日志数据;在您的服务器上,记录您发送给客户端的密钥以及 UTC 时间戳。使用未加密的时间戳存储日志,以便当用户的客户端应用程序发送日志数据时,您将知道使用哪个密钥来解密它。显然用户可以轻松更改时间戳,但这相当于用户只是从他们的机器中删除日志数据(这是您无法阻止的);同时,用户很难弄清楚使用什么密钥来加密数据,因此用户读取或伪造日志数据并不容易(但同样,如果用户付出足够的努力,用户可以读取/伪造日志数据进去)。
您可以采取措施来混淆内存中的加密密钥,例如将其存储在多个部分中。例如,假设您使用的是 AES 128,您可以将密钥存储在两个 64 位块中,然后在加密数据之前将它们连接起来,然后在完成后立即从内存中擦除连接的密钥。或者,您可以将两个异或的 128 位密钥存储在一起,一旦完成,再次从内存中擦除异或密钥。专门的用户仍然可以找出密钥,但这会使他们更加困难。
您可以采取的另一个步骤是使用除 AES 之外的加密算法,例如,任何其他 AES 决赛入围者,如 Twofish 或 Serpent(不要实现自己的加密算法,最好广播您正在使用强算法,例如AES 比您使用的是弱混淆算法)。请记住混淆加密库的类和方法名称,以使用户更难弄清楚您正在使用什么加密算法。(如果您要编译为机器代码,这会更有效 - 如果您使用的是 Java,这可能不值得,因为用户可以简单地反编译您的代码并使用您自己的解密代码来解密日志文件。)
在确定玩家是人类还是机器人方面,即使是预算比你大得多的游戏也无法可靠地做到这一点 - 你真正能做的就是引导用户或在他们展示时向他们发送某种验证码“类似机器人”的行为,但这并不是万无一失的,你真的应该赞成不要惹恼合法用户而不是引导机器人。