我正在将对象发送到 java 中的服务器,但是除了已经提供的安全性之外,我还想确保它没有被篡改。我了解如何使用消息摘要,但是,校验和是否应该理想地放置在对象中?如果是这样,这不会改变最后的校验和。你怎么办?它如何与 TCP 标头等一起工作,这让我有点困惑。
谢谢
我正在将对象发送到 java 中的服务器,但是除了已经提供的安全性之外,我还想确保它没有被篡改。我了解如何使用消息摘要,但是,校验和是否应该理想地放置在对象中?如果是这样,这不会改变最后的校验和。你怎么办?它如何与 TCP 标头等一起工作,这让我有点困惑。
谢谢
假设您的校验和是 32 字节长。您根据数据计算校验和,并将校验和附加到它的末尾。收到数据后,就知道校验和占用了最后32个字节,实际数据在校验和之前。
使用 tcp/ip 时,可以合理地确定流在传输过程中不会“意外”损坏,所以不要为此烦恼。
如果您担心安全性,请注意 Md5 不安全,任何人都可以计算 md5 校验和,您需要某种密钥或 pki 解决方案进行签名。
请注意,“签名”只是身份验证,其他人仍然可以读取实际消息。如果您还希望内容保密,则需要加密 + 身份验证。
一个简单的解决方案是通过 ssl-socket 发送数据。
我建议转向 bouncycastle 以获得良好的加密支持。
如果消息以其他方式传输(并且可能需要由其他系统处理,存储在文件中,ftp:ed、mq:ed、xml-ed 等),您可以将消息序列化为字节 [],并使用 org.bouncycastle.crypto.signers 中的签名者对其进行签名,并在实际消息之后计算并附加签名作为字节 []。
在这种情况下,您需要使用消息格式,以便您可以分离和提取数据和签名,然后重新计算签名(使用发送方的公钥)并确保接收到的和计算的签名匹配.
为此有几个标准,S/MIME、pgp、PKCS#7RFC 3369,它们可能比你或我能想出的任何东西都要好,所以调查一下。
如果您使用的是 RMI,您可以搜索“安全 rmi”——例如使用 SSL 套接字工厂。如果您只想进行身份验证(明文+签名),您甚至可以编写一个身份验证套接字工厂...
如果您对安全性一无所知,最简单的解决方案可能是使用 VPN 或 ssh 设置安全隧道,并使用它发送您的消息。
消息的校验和不能是该消息的一部分——计算校验和几乎是不可能的。
校验和必须从消息 + 一些密钥中计算出来。(没有密钥,攻击者可以修改消息并轻松计算其校验和。)我在这里看到的唯一问题是攻击者可以重复消息,所以如果你收到两条相同的消息,你不知道后面的是否是从攻击者。
广告 TCP 标头 - 你为什么要为此烦恼?只需发送消息和校验和。TCP只是传输协议;TCP 或 IP 校验和不是为了安全,它们是为了检测传输错误。
我相信 TCP 和 IP 使用填充零的校验和字段来计算它们的校验和。然后接收器在假设字段为零的情况下计算校验和,并与实际校验和进行比较。
当然,如果您不想采用仅在末尾附加校验和的简单解决方案,您当然可以做类似的事情。
但是请注意,这并不能提供太多的防篡改保护,因为攻击者只需将校验和替换为更改数据的校验和即可。您需要公钥签名(具有适当的信任关系)来防止篡改。