Websocket 安全

Websocket Security

我正在寻找使用 WebSockets 与我们的服务器通信的网络 (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等哈希来验证和保护请求。

据我所知,我们无法通过 WebSockets 请求发送 headers,因此我想知道如何确保每个请求的安全。

有没有人有任何想法或好的做法?

要保护您的消息,请在 SSL/TLS 上使用 WebSocket(wss:// 而不是 ws://)。不要推出自己的加密货币。

关于身份验证。 HTTP 和 WebSockets 之间的最大区别在于 HTTP 是无状态协议,而 WebSockets 不是。

对于 HTTP,您必须在每个请求中发送 headers(cookie、令牌等)。使用 WebSockets,您可以建立连接。在第一次交互中,您可以对客户端进行身份验证,对于连接的其余部分,您知道客户端已通过身份验证。

Heroku 的人员描述了一种模式,其中客户端使用 HTTP 进行身份验证,获取票证,然后将该票证作为第一条消息通过 WebSocket 连接发送。参见 https://devcenter.heroku.com/articles/websocket-security

我同意 SSL/TLS wss:// 连接。始终使用加密流量。有几种方法可以实现身份验证。看这里: http://simplyautomationized.blogspot.com/2015/09/5-ways-to-secure-websocket-rpi.html

大多数示例使用 python 或 nodejs,并且针对 Raspberry Pi,但一般概念是值得考虑的好主意。 post 中有指向 SocketRocket 帮助程序库的链接,允许您将身份验证插入 auth header (SocketShuttle)。

与服务器进行安全通信包括对双方进行相互验证。如果您需要通过一个通信渠道(现在这种想法很少见)来引导具有不同身份验证凭据的不同用户,您将需要单独的身份验证。否则,你只需要想出密钥分配方案(这样你的应用程序就会知道你服务器的 public 密钥并且你的服务器有一个协议来熟悉客户端的 public 密钥,有很多这个的模式)。

为此,有一个比 SSL 或您自己的加密更宽的选择梯度(尽量避免不惜任何代价编写您自己的加密)。

对于堆栈的网络服务器到浏览器部分,SSL 是您唯一的选择,但它不应被视为一种好的安全措施,每年都会出现越来越多的漏洞、密码退化案例和信任问题。它承载了 20 年错误的工程决策和紧急修复的包袱,所以如果你能得到更好的东西 - 这样做是值得的。尽管如此,对于常规网络来说,它总比没有好得多。

在您的移动应用程序中,您可以轻松地使用众多加密库之一,提供与服务器的安全会话消息传递,具有更高的安全保证,无需依赖:

  • https://github.com/mochtu/libsodium-ioslibsodium-ios,NaCl 的 ios 包装器,最好的现代密码学之一libraries,它有很多对 ECC 密码学的新颖实现,在学术界受到高度评价,并且由一个渴望在所有情况下都具有最佳性能的狂人编写(简而言之:我喜欢它:))。

  • Themis,一个我参与的项目,我们有非常适合 ObjC 的 iOS 版本的库,还有一个方便的iOS 中关于通过 websockets 进行安全流量的教程:https://www.cossacklabs.com/building-secure-chat

您应该保护与 SSL/TLS 的连接,并在 http 上使用 https,在 ws 上使用 wss。对于 auhentication/authorization,您可以将查询参数添加到 websocket 连接,还可以添加类似 username/passwprd 的内容。 例如:

wss://example.com/path?username=password=anotherParam=99ace112-dd56-427e-ba3d-9dd23e9c7551

是的,在 js 中你不能添加你的任意 header,但你可以添加协议和 Sec-WebSocket-Protocol header 到你的 webocket 连接和 server-side authenticate/authorize 基于 websocket 协议的用户