对于个人MMO游戏项目,我在java中实现了一个自制的可靠的基于UDP的协议。鉴于我当前的设置,我相信对于一个窥探者来说劫持会话会相对简单,所以为了防止这种情况,我借此机会学习一点密码学。非常有趣。
我可以使用Diffie-Hellman key exchange(一个非常聪明的概念)在客户端和服务器之间成功创建共享密钥,但现在我需要使用它来保证数据包的真实性。到目前为止,我的初步测试表明,我尝试了几种不同的密码,但是我希望尽可能地保持小而快的数据。
鉴于我只是试图验证数据包而不是nessecarily隐藏整个有效负载,我认为我可以将从密钥生成的8字节会话ID放入数据包头,加密整个数据包,以及将其哈希回到8个字节。我取出未加密的数据包并将8字节的哈希值放入会话ID的位置,然后将其发送出去。
这会安全吗?加密整个数据包只是为了发送它不加密,感觉有点不雅 - 是否有更好/更快的方法来实现我的目标?请注意我自己的经验很好,所以我对第三方库或其他协议选项不感兴趣。
答案 0 :(得分:4)
如果两个对等方都可以访问共享密钥(因为您正在谈论Diffie-Helman),您可以简单地在其标头中存储数据报的哈希值。接收者检查它是否匹配。
作为一项额外的安全措施,您还可以在数据报中添加“质询”字段,并在散列过程中的某处使用它以防止重放。
所以这个哈希应该涵盖:
“挑战”是一个严格递增的数字。您只需在每次发送新消息时更改哈希值,都可以将其添加到数据报中。如果有人拦截了一条消息,它就无法重新发送:接收方确保它不接受它。