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