Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java加密日志_Java_Logging - Fatal编程技术网

Java加密日志

Java加密日志,java,logging,Java,Logging,我现在正在做一个游戏。我已经在内部构建了日志记录功能,并且有一些消息类型,比如general、log、exception、send、receive和debug 发送和接收日志包含原始日志信息,因此它们确实包含我通过网络发送的内容 该游戏使用客户机-服务器模式,并使用SSL连接,因此网络信息无法更改。然而,对于日志记录,我会将文本记录为纯文本,这显然会带来麻烦。我还计划简单地屏蔽任何个人信息(如密码等) 不过,我有几点担心: 客户端程序包含用于SSL的信任库,服务器的主机名/IP和端口也不是真正

我现在正在做一个游戏。我已经在内部构建了日志记录功能,并且有一些消息类型,比如general、log、exception、send、receive和debug

发送和接收日志包含原始日志信息,因此它们确实包含我通过网络发送的内容

该游戏使用客户机-服务器模式,并使用SSL连接,因此网络信息无法更改。然而,对于日志记录,我会将文本记录为纯文本,这显然会带来麻烦。我还计划简单地屏蔽任何个人信息(如密码等)

不过,我有几点担心:

  • 客户端程序包含用于SSL的信任库,服务器的主机名/IP和端口也不是真正的秘密。因此,如果一个人知道通过网络发送什么,那么他可以表现得像客户一样,对吗
  • 如果一个人能够看到客户端发送和接收的内容,那么他就可以很容易地制作一个机器人。(这款游戏是一款基于回合的2D游戏,因此我认为,只要依赖所有网络数据,你就可以玩这款游戏。在任何方面都不需要鼠标技能。)
总而言之:我怎样才能记录所有信息并将其写入文件,而没有其他人能够读取、修改或以任何方式使用它?

我们非常感谢所有的评论,我也非常感谢就如何实施这一制度提出具体建议


问候。

你无能为力。如果客户机是用Java编写的,那么进行反向工程或使用AspectJ之类的工具来监视客户机向网络写入的内容就相当容易了。同样,对于写入日志系统的任何数据,即使它最终是加密的

如果您担心加密服务器上的数据,那么最简单的解决方案是一个完整的分区加密程序,如有人窃取机器/硬盘驱动器,这将保护服务器数据

如果在客户端计算机上加密数据,则这意味着加密密钥也必须位于客户端计算机上的某个位置(即使它位于主内存中)。继续加密或混淆日志信息,让用户更难阅读,但请注意,如果用户投入足够的精力,仍然可以阅读日志。也就是说,混淆数据的最佳方法是使用从未保存到磁盘的密钥对其进行加密-例如,当用户登录时,然后向他们发送一个新的加密密钥,他们的客户端应用程序将使用该密钥加密日志数据;在服务器上,记录已发送到客户端的密钥以及UTC时间戳。使用未加密的时间戳存储日志,这样当用户的客户端应用程序发送日志数据时,您将知道使用哪个密钥对其进行解密。显然,用户可以轻松地更改时间戳,但这相当于用户只需从他们的机器上删除日志数据(这是无法阻止的);同时,用户很难弄清楚加密数据使用了什么密钥,因此读取或伪造日志数据对用户来说并不容易(但是,如果用户投入足够的精力,也可以读取/伪造日志数据)

您可以采取步骤混淆内存中的加密密钥,例如将其存储在多个部分中。例如,假设您使用的是AES 128,您可以将密钥存储在两个64位块中,在加密数据之前将其连接起来,然后在使用完连接的密钥后立即将其从内存中擦除。或者,您可以将两个128位的密钥存储在一起,在使用完Xor后,再次从内存中擦除Xor密钥。一个专门的用户仍然可以找出关键,但这将使他们更加困难

您可以采取的另一个步骤是使用AES之外的加密算法,例如任何其他AES最终入围者,如Twofish或Serpent(不要实施您自己的加密算法,您最好使用AES之类的强算法,而不是使用弱模糊算法)。只需记住混淆加密库的类和方法名,让用户更难了解您使用的加密算法。(如果您编译为机器代码,这会更有效——如果您使用Java,这可能不值得,因为用户可以简单地反编译您的代码并使用您自己的解密代码来解密日志文件。)


在确定玩家是人类还是机器人方面,即使是比你的预算大得多的游戏也无法可靠地做到这一点——你真正能做的就是引导用户,或者在他们表现出“机器人式”行为时向他们发送某种验证码,但这并不是万无一失的,你真的应该支持不要打扰合法用户而不是启动机器人。

我和你有完全相同的需求。有个叫“maybeWeCouldStealAVa”的家伙在以下方面写了一个很棒的实现:


我已经确认它是有效的,但是当我在每行末尾“flush()”时,我会丢失消息的最后一部分(最多16个字节),直到下一条消息被写入。我可以在每行末尾关闭(),因为这似乎是写入填充的唯一方法。但至少它不需要读取整个文件就可以附加到其中。

所以,即使没有日志记录,任何人都可以像真正的客户机一样行事?您尝试通过SSL实现的不是所有网络数据都是安全的吗?有没有办法确定我是在与真正的玩家打交道,还是在与机器人打交道?SSL保护发送的数据不被客户端和服务器截获。它不会阻止客户端检查数据。请注意,Java中的现代垃圾收集意味着您无法可靠地“从内存中擦除”任何内容。即使将数组归零也不意味着内存管理器没有在其他地方对其进行临时复制。