0

我正在为游戏编写我的第一个登录系统。决定 SRP 并成功实施了该交互。客户端和服务器现在具有相同的会话密钥。我该如何使用它们?

关于它的所有信息都说它可以用于加密通信,但我还没有找到说明如何使用的信息。

SRP 在身份验证过程中交换会话密钥。此密钥可用于加密用户的登录会话...

http://srp.stanford.edu/advantages.html

已建立的会话密钥“S”可用于加密客户端和服务器之间的进一步通信。

http://connect2id.com/products/nimbus-srp

这里有什么选择,什么是好的选择?AES?

谢谢!

4

1 回答 1

1

建议您使用 SRP 登录,然后使用共享的 SRP 会话密钥自己进行数据传输加密。使用开箱即用的库和有据可查的配置(例如自签名证书)使用常规 TSL 会更安全、更容易。然后在该加密连接的顶部,使用 SRP 作为密码证明登录用户,您就完成了。

如果您真的想做您建议的事情,那么您选择的对称加密算法将基于性能开销与算法的已知优势/劣势。AES 非常强大但非常昂贵。如果你要加密磁盘上的文件,你想保证安全,你想使用非常强大的密码。游戏流量很少需要保护免受扩展离线攻击;通常游戏的结果是公开的,并且在游戏结束数小时后解密的游戏痕迹没有任何价值。在这种情况下,您可以使用非常便宜的流密码来保护流量。

例如,您可以考虑ISAAC,它既快速又便宜,它也可用作随机数生成器。这意味着您可以找到几乎所有语言的实现,包括浏览器 javascript. 您将使用 SRP 共享密钥在客户端和服务器上播种 Isaac 生成器的初始状态。然后对于您要传输的每 32 位数据,您获取下一个 Isaac 32 位伪随机数并对数据进行 XOR 并发送。在另一端,您与下一个 Isaac 32 位伪随机数进行异或以恢复原始数据。任何窥探数据包的人都没有来自 SRP 共享密钥的 Isaac 种子,因此他们无法解码加扰的数据。Isaac 需要 256 x 32 位字作为其初始状态,而 SRP 密钥将只有 8 x 32 位字(如果您使用 SHA256 作为 SRP 散列算法)。这意味着您需要拉伸您的 SRP 密钥,否则重复 32 次以生成 Isaac 种子。一个关键的拉伸算法,例如PBKDF2可用于扩展 SRP 密钥以填充初始 Isaac 表。这应该“足够好”以保护游戏免受“实时”窥探。(编辑:递归散列密钥 32 次以生成 isaac 种子是另一个想法。)

再一次,我不建议采用上述方法;我建议使用标准 TLS/HTTPS 来加密连接,然后使用 SRP 作为密码证明来仅对用户进行身份验证并通过初始加密连接发送所有流量。

编辑有一个关于密码学入门课程的作业,使用每个字母出现在足够大的加密文本正文中的概率来破解上面的维吉尼亚密码。所以你应该在加密之前压缩你发送的数据。然而,这实际上告诉我们的是“永远不要编写自己的加密”,因为您可能错过了可能的攻击,只能使用经过专业同行评审的代码,例如 TSL。)

于 2014-12-20T20:56:00.090 回答