我正在工作的游戏,有多人支持,我想加密服务器-客户端连接。在使用SecretKey对象和ObjectInput/OutputStream之前,我已经这样做了。但是,我希望保留其他语言连接到服务器的能力(如果我曾经使用另一种语言并希望移植我的游戏)。我是否可以在不使用Java对象的情况下加密所有数据,这样任何语言都可以使用它吗?
发布于 2014-01-18 12:06:59
二进制对象序列化
您需要采取的一个操作是将对象序列化为二进制格式。您可以使用标准序列化API来完成此操作,也可以创建自己的编码器/解码器。确保你详细地描述了你自己的协议--每一点都应该被描述,否则你会遇到麻烦--如果不是直接的话,那么几年后。
有标准化的方法,或者用ASN.1之类的二进制编码来创建自己的协议,但是如果你走了这条路,希望有一个相当陡峭的学习曲线。但是,使用标记/长度/值作为值的一般想法是一个很好的想法,因此您也许可以看看例如BER/DER编码。
序列化对象的加密
要加密,您可以创建自己的加密协议。论坛上的大多数人都走这条路,而大多数人都失败了。他们设法使他们的协议工作,但他们也留下了多个安全漏洞。
在传输中确保数据安全的最佳方法之一是TLS。所以如果TLS适用的话,一定要走这条路。在初始设置之后,TLS的开销相对较低,因此可能不需要尝试实现相互竞争的专有协议。
您也可以在应用程序级别加密,而不是传输级别。解决这一问题的一种方法是依赖以前的加密强制件格式标准。众所周知的格式是CMS (以前称为PKCS#7)或PGP。PGP和CMS格式是在Bouncy城堡库中实现的。它们都是二进制格式,其中有许多选项。
发布于 2014-01-17 15:08:04
您可以使用Externalizable接口在Java中创建自己的自定义对象序列化程序。自定义序列化程序可以写出Java对象的状态,以便其他语言可以读取它们。我已经实现了这个项目,在这个项目中,我需要序列化才能工作,即使对象改变了,旧的状态也需要读取。自定义序列化的痛苦之处在于,您必须仔细跟踪对象字段,否则反序列化方法将产生奇怪的bug。
https://stackoverflow.com/questions/21188807
复制相似问题