我被要求在游戏服务器和客户端之间实现流量加密。目前,通信是不加密的任何方式,这让玩家使用欺骗来监听流量,以获得有关的信息的对手的位置。
流量数据包很小(50-70字节),开发人员还没有准备好进行大开销的加密。
会话启动后,客户端通过https与服务器进行通信;此时,我们可以发送一个秘密密钥。我们认为玩家将无法通过从内存中提取这个密钥,或者以某种方式获得这个密钥。
在CTR模式下的AES将用于流量加密。带有密钥的快速散列函数将用于身份验证。标记将使用4-6字节(而不是16字节)。
这种实现有多安全?哪个哈希函数更适合使用?对于哈希函数和AES,我们可以使用相同的密钥吗?
发布于 2013-12-15 08:03:08
我们认为玩家将无法通过从内存中提取这个密钥,或者以某种方式获得这个密钥。
原谅我,但我很怀疑。如果你真的想出了办法来做到这一点--而且很多资金充足的,聪明的人已经尝试过,但失败了--我建议你给它打个专利,并从许可费中赚取数百万美元。
这种实现有多安全?
不管你最后做了什么,关键可能是薄弱环节。或者,攻击者可能会尝试从内存中读取解密数据包,而不是从密钥中读取。
我假设当您说“带有密钥的快速散列函数将用于身份验证”时,您的意思是您将使用HMAC进行身份验证。如果你有别的意思,请澄清。
使用HMAC和CTR是一种很好的方法。只需确保认证密文(“加密-然后-MAC”),而不是明文( "MAC -然后-加密“或”MAC和加密“)。
然而,真正的魔鬼在于细节。您已经对您的方法进行了全面的概述,而不是一个特定的算法/协议,也没有一个实现。这两种过渡都有出错的可能。例如,您的协议会防止重放攻击吗?您的实现会安全地生成CTR非CTR吗?
标记将使用4-6字节(而不是16字节)。
我不会用这么短的标签来保护金融数据,但对于一个游戏来说,这可能是好的。
哪个哈希函数更适合使用?
这取决于你对“更好”的定义。沙-2可能是最安全的。沙一可能已经足够安全了。HMAC-MD5还没有损坏,但是通常不推荐使用它,因为MD5已经坏了。另一方面,如果“更好”的定义包括性能,而不是使用MD5可能值得承担安全风险(考虑到您所保护的信息相对较低的风险)。
对于哈希函数和AES,我们可以使用相同的密钥吗?
别这么做。这可能不会直接导致任何明显的攻击,但是密钥重用通常会激怒密码神,因为它违反了密码家在设计这些算法时所做的关键假设(heh)。这相当于对缓冲区不做任何边界检查。(如果您稍后转而使用类似CBC之类的方法进行身份验证,那么密钥恢复将是一个明显的问题。)
如果由于任何原因传送两个键是有问题的,您可以通过这样的操作从主键中安全地派生密钥:
encryption_key = HMAC-SHA1(master_key, "Encryption key")
authentication_key = HMAC-SHA1(master_key, "Authentication key")发布于 2013-12-15 11:14:10
SipHash很适合低数据量和小标签的使用。
https://crypto.stackexchange.com/questions/12325
复制相似问题