我正在创建一个直接从浏览器运行并具有多人功能的多人游戏(基于 websockets)。每个玩家都需要有自己的账户(用户名和密码)。当我计划游戏时,我意识到将它迁移到其他平台的最简单方法是用 HTML5 编写它。所以,我需要使用 JS 和 websockets 创建一个登录系统。但我不确定向 websocket 服务器(在 Java 虚拟机中运行)发送包含用户名和密码等内容的消息有多安全。
使用 websocket 对用户进行身份验证的最佳方法是什么?
信息安全
javascript
爪哇
2021-08-28 07:15:29
2个回答
如果您想要安全,通过 TLS 传输身份验证数据是一个很好的开始。但是让我们假设 websocket 已经通过 TLS 设置。我建议的解决方案将基于挑战-响应机制:
- 服务器将设置一组随机字节(质询),设置一个超时时间,在该超时时间结束时质询不会被授权。
- 客户端将以“纯文本”形式发送用户名和质询以及哈希(使用 SHA2 或 SHA3 算法)
challenge || username || f(password),f(password)即密码在数据库中的存储方式(例如 SHA256password)。 - 服务器使用用户名的数据和质询响应进行验证,如果是,则对用户进行身份验证。它还使挑战无效,以使将来使用此挑战的任何尝试无效。
此方法提供反重放功能:攻击者无法捕获数据并稍后重放以进行身份验证。
然而,我对这种方法有一个大问题:f(password)这里的安全性与password:如果数据库泄漏,任何攻击者都可以像其他任何人一样进行身份验证。我说“大致”是因为,如果以明文形式存储,由于许多用户在多个网站上使用相同的密码(这很糟糕),他们的帐户可能会在其他地方被盗用。
我想不出一种防止数据库泄漏和防重放机制的方法,但是应该使用 TLS 上的防数据库泄漏机制(通过 TLS 以明文形式发送用户密码,使用数据库盐的哈希密码并与数据库进行比较)足以应对您将面临的大多数风险
如果您想要密码,最好的方法是使用 TLS,然后以明文形式发送密码。这比挑战-响应机制更简单。
但是,如果您无法为 websockets 使用 TLS,但您拥有用于代码的 TLS(通过 HTTP 传递),最好的办法是通过 HTTPS 进行登录,生成会话 cookie(或其他形式的密钥)并使用它们对 websocket 进行身份验证。如果您以明文方式进行质询响应,则攻击者可以使用该通信强行破解密码。使用会话方法,攻击者只能捕获您(非敏感)游戏的会话,但不能捕获(可能重复使用的)密码。但是,当您在两者上都没有 TLS 时,您应该让用户通过第三方进行身份验证,例如通过 OpenID。然后,您无需处理密码等敏感数据。对于其他情况,OpenID 也是一个不错的选择。
其它你可能感兴趣的问题