2010-03-10 122 views
0

我正在向java中的服务器发送对象,但是我想确保它没有被篡改,除了已经提供的安全性。我理解如何使用消息摘要,但是,理想情况下校验和应该放在对象中吗?如果是这样,最终会改变校验和。你如何去做这件事?它如何与TCP头文件等工作,它开始混淆了我qutie一点。MD5/SHA1校验和

谢谢

回答

1

假设您的校验和是32个字节长。您可以根据数据计算校验和,并将校验和附加到数据的末尾。当您收到数据时,您知道校验和占用了最后32个字节,实际数据在校验和之前。

0

消息的校验和不能作为该消息的一部分 - 计算校验和几乎是不可能的。

校验和必须从消息+某个密钥计算出来。 (没有秘密密钥,攻击者可以修改消息并轻松计算其校验和。)我在这里看到的唯一问题是攻击者可以重复消息,所以如果你收到两个相同的消息,你不知道后面的消息是来自攻击者。

广告TCP头 - 为什么你打扰它?只需发送消息和校验和。 TCP只是传输协议; TCP或IP校验和不是为了安全,而是用于检测传输错误。

0

我相信TCP & IP计算它们的校验和与填充零的校验和字段。然后接收器计算校验和,假设这些字段为零,并与实际的校验和进行比较。

当然你可以做类似的事情,如果你不想采取最后加上校验和的简单解决方案。

但是请注意,这并不能提供很好的防篡改保护,因为攻击者可以用校验和来替换校验和。您需要公钥签名(具有适当的信任关系)以防止篡改。

0

当使用tcp/ip时,合理确定流在“意外”传输中没有被破坏,所以不要担心。

如果您担心安全问题,请注意Md5不安全,任何人都可以计算md5校验和,您需要某种密钥或pki解决方案来进行签名。

请注意,“签署”只是身份验证,实际的消息仍然可以被其他人阅读。如果你还希望内容是秘密的,你需要加密+认证。

一个简单的解决方案是通过SSL套接字发送数据。

我建议转向bouncycastle以获得良好的加密支持。

如果邮件以其他方式传输(可能需要其他系统处理,存储在文件,ftp:ed,mq:ed,xml-ed等等),您可以将邮件序列化为byte [],并使用org.bouncycastle.crypto.signers中的签名者对它们进行签名,然后在实际消息之后计算并附加一个签名为byte []。

在这种情况下,您需要使用消息格式,以便可以分离并提取数据和签名,然后重新计算签名(使用发件人的公钥)并确保接收并计算签名匹配。

对于这个,S/MIME,pgp,PKCS#7RFC 3369有几个标准,它们可能比你或我能想出的任何东西都好,所以要对它们进行调查。

如果您使用RMI,您可以谷歌“安全rmi” - 例如使用SSL套接字工厂。如果你只是想要认证(明文+签名),你甚至可以写一个认证套接字工厂...

如果你不知道安全性,最简单的解决方案可能是建立一个安全的隧道使用VPN或ssh,并使用它发送消息。

+0

哦,我忘了,WS-Security正在为webservices/soap做这个,如果这就是你正在使用的。 – KarlP 2010-03-10 12:44:33