如果您只使用“公钥”(实际上不是公钥,它是一个随机数,并且应该是随机的,除非您真的希望它在某个时间范围内可用,在这种情况下,请确保您使用带有密钥的HMAC来生成它,因此对手无法预测 nonce ) 以防止重放攻击,并且它是固定大小的,那么连接可能不是问题。
也就是说,我有点担心您可能没有经过深思熟虑的安全模型。无论如何,这试图阻止什么攻击?用户的密码哈希是未加盐的,因此密码数据库的破解无论如何都会很容易地揭示明文密码,虽然有时间限制的随机数可以减轻来自被动嗅探器的重放攻击,但这样的被动嗅探器可能只会窃取用户的会话密钥反正。说到这里,为什么不直接使用会话密钥作为 nonce 而不是基于时间戳的系统呢?
但实际上,为什么不直接使用 SSL?密码学真的很难做到正确,比你或我聪明得多的人花了几十年的时间审查 SSL 的安全性以使其正确。
编辑:如果您担心 MITM 攻击,那么 SSL 将拯救您。时期。Mallory 可以将您的超级安全登录表单替换为以明文形式向他发送密码的表单。游戏结束。即使是被动的攻击者也可以通过网络看到一切——包括您的会话 cookie。一旦 Eve 获得会话 cookie,她只需将其注入浏览器并已登录。游戏结束。
如果您说您不能使用 SSL,那么您需要非常仔细地查看您要保护的确切内容,以及您将缓解哪些类型的攻击。您可能需要实现某种桌面应用程序来进行加密 - 如果 MITM 正在流行,那么您将无法信任您的任何 HTML 或 Javascript - Mallory 可以随意替换它们。当然,您的桌面应用程序将需要对数据流实施密钥交换、加密和身份验证,以及远程主机的身份验证——这正是 SSL 所做的。如果你做对了,你可能会使用与 SSL 几乎相同的算法来做到这一点。
如果您决定 MITM 不在范围内,但您想防止被动攻击,您可能需要在 Javascript 中实现一些严格的密码学 - 我们正在讨论Diffie-Hellman交换以生成永远不会发生的会话密钥通过网络发送(HTML5 Web 存储等),在 Javascript 中使用 AES 来保护密钥等。此时您基本上已经在 Javascript 中实现了一半的 SSL,只有其中可能存在更多错误 - 尤其是这是在Javascript中很难获得安全随机数的问题。
基本上,您可以选择:
- 没有实现任何真正的加密安全(显然不是一种选择,因为您正在实现所有这些复杂的身份验证协议)
- 实现一些看起来很像 SSL 的东西,只是可能没有那么好
- 使用 SSL。
简而言之 - 如果安全很重要,请使用 SSL。如果您没有 SSL,请安装它。我知道的每个可以运行 JS 的平台也可以处理 SSL,所以真的没有任何借口。