我正在使用websockets做一些工作,需要解决安全问题。根据我的阅读,很明显,SSL是我所处环境中最好的方法,因此WSS是可行的方法(这不是问题,只是事实的陈述)。
服务器可能会向客户端流式传输大量数据。数据不是私有或敏感的,因此我不担心有人在嗅探数据。我主要担心的是,WS连接已得到验证,因为在服务器上接收命令可能有害且具有破坏性。客户端必须是受信任的。
该服务器将是具有有限处理能力的嵌入式设备。因此,我认为数据可以通过WS进行明文传输。
因此,我的方法是让客户端wss连接到服务器,进行身份验证并请求会话密钥。然后,客户端将断开与wss连接的连接,然后通过ws连接到服务器,并传递从先前的wss连接接收的会话密钥。如果连接立即通过有效的会话密钥(会话密钥具有适当的到期时间),则服务器将仅接受ws连接。每个客户端仅允许通过ws进行一次连接尝试,并在成功的wss连接上进行重置。
所以我的问题是这种方法是否合理,或者我的方法是否会存在一些严重的漏洞。我仅限于ws和wss,我在服务器上使用带有websocket-node的node.js,在客户端使用纯javascript。
最佳答案
这听起来很合理(假设服务器到客户端确实不是秘密)。但是,我建议您进行一些更改:
只需保持两个从客户端到服务器的WebSocket连接。第一个是wss,用于令牌交换和客户端到服务器的命令(您提到的可能有害)。如果第一个连接断开或超时,则ws连接也应终止。
不允许任何客户端通过ws连接服务器命令/控制。
确保除超时外,令牌只能使用一次。否则,攻击者可能会嗅探ws连接并尝试重播令牌以获得连接。
您还需要确保您的初始wss连接是经过授权的(不仅仅是加密的)。换句话说,服务器需要能够验证客户端的身份,并具有进行此连接的授权。另外,如果ws连接确实只是用于不受保护的服务器到可以嗅探到的客户端数据的连接,那么攻击者能够成功建立连接就不是世界末日,因为攻击者正在消耗带宽和服务器CPU (再次假设客户端到服务器的命令仅限于wss连接)。
另外,我会尝试以ws和wss为基准测试服务器到客户端的连接。额外的CPU负载可能比您预期的要宽容(某些嵌入式设备在硬件中也具有SSL / TLS卸载功能)。
关于security - 使用WSS进行身份验证然后使用WS进行数据有意义吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14211739/