如何确保websocket中socket.emit数据的安全性
发布于 3 年前 作者 xia123zheng 6972 次浏览 来自 问答

项目采用的是websocket来传输数据,具体是websocket客户端用socket.emit来传输数据,接收端监听事件,获取数据。由于传输的数据涉密性很高,而一般的websocket利用http,http是明文传输,很容易造成数据被别人拦截获取,如何确保数据传输的安全性呢?现在想到的方法有利用https,即wss,但是没有调试成功,请教大神们有没有好的意见与建议呢?跪求~

29 回复

客户端是非html的,采用的模块是socket.io-client

socket io用https没有问题, 主要是把反向代理配好就可以了

可以设计token做校验,想简单的话就去用jwt

@Soontao 现在的业务场景是通过socket.emit的数据是高并发的,如果采用https是不是会造成性能上的问题呢,应对这种业务场景,有没有好的解决办法呢

@qujinxiong 基于token的应用场景是用户登录验证,用在此处的高并发数据流的验证合理吗

我有一个项目是通过aes加密明文,RSA公钥加密aes密钥,传递加密后的密钥和密文到服务器,服务器用RSA私钥解密后的密钥和客户端进行后续通信,

来自酷炫的 CNodeMD

@zswnew 能详细说下不,很急呀,能截下你项目中的加密部分的代码块呢

我不知怎么给你说, 你要会用aes加密字符串,还要会用RSA加密字符串, 然后这个RSA是非对称加密,有个公钥(加密)私钥(解密),aes对称加密,有个密钥即可加密又可解密, 这时候,客户端生成AES密钥,用RSA公钥加密AES密钥,再用AES密钥加密通信内容, 把这两个内容发送到服务端(需要指定加密后的密钥段,和密文段,用json或指定区域表示),服务端通过RSA私钥解密得到AES的密钥,再来解密通信内容,

来自酷炫的 CNodeMD

理解上面说的后就看这个,首次通信后服务端就得到了AES密钥,就可直接通过这个密钥加密明文向客户端发送信息,而客户端后续也可通过这个AES密钥进行后续通信。

来自酷炫的 CNodeMD

最后注意,这个RSA加密,网页加密后的密文nodejs进行解密要注意,要调用某个方法(我有点忘了),这个AES密钥是在一次会话时重新生成(不是每次请求都生成,即这次断开连接后下次连又要重新生产),只要客户端不泄漏AES密钥,服务端不泄漏rsa私钥,就可以保证数据安全。我当时就是这么做的,在登录注册和服务端通信时。

来自酷炫的 CNodeMD

@xia123zheng 看你怎么设计了。你可以在为每一次握手进行验证,而不是每一次监听。为了安全,损失一些性能,这是个两难命题,看你的选择。

基本概念都弄错了,websocket紧紧在握手时利用http协议,之后会 switch 协议!!!

@vincentLiuxiang 对呀,仅仅是在握手部分采用了http协议,之后data传输都是基于tcp的连接,我想问的是刚开始握手信息的加密和data传输的加密是分开做的,还是只需要握手部分加密即可

@zswnew 最近没登社区呢,不好意思哈。你的做法是可以的,在登录认证这块的应用场景,客户端与服务器数据交互不是很频繁,这种数据加密解密不会太影响性能,但是我这边的应用场景是数据高并发的过来,如果还是基于这种每个包的加密解密模式,会不会导致系统响应超时呢

@vincentLiuxiangws协议分为两个部分,第一个部分就是建立连接,也就是握手部分,这部分是基于http的,其实就是利用http协议头进行认证握手,第二部分是数据传输,是基于tcp连接,由于http协议也是基于tcp协议,你指的switch协议,其实并没有切换协议,底层还是tcp连接,只不过是连接建立后,传输数据包中就丢掉了关于http认证连接的信息

@qujinxiong 每一次握手进行验证和每一次监听验证,区别在哪呢,能说明白点吗

概念上不是 https 吧,说 wss 倒没毛病。 wss 都没弄顺,其它的方案建议暂时也不要想了,否则后面的维护可能更困难,而且,也没有能力评估是否真的安全。 如果你的客户端不是浏览器环境,那么完全可以不受限于 websocket ,但是,不管协议怎么设计,要安全,外面套一层 SSL 都是很经济的方案。 “涉密性”很高,那你还可以跳出应用层的范围,设计你的网络,划分子网,做白名单。

@xia123zheng 就是拨通电话和每说一句话的区别

@yszou 的确不是同一个东西,我也没有强调是一个东西呀,WSS是基于HTTPS,实现的握手部分的加密认证。你提到思路很有参考价值,但是数据必须走公网传输,具体的背景比较复杂就不过多说了,那怎么设计网络也跳不出明文数据包被截获的问题,是吧?

@qujinxiong 恩恩,感谢。看见你创建的话题了,你是在知人科技工作吗?公司招nodejs和java不,小弟今年参加校招-。-

@xia123zheng

跟是不是公网没关系,比如 VPN ,也是安全方案,对吧,我的点,是说,这事不一定只在应用层考虑。这跟你系统规划大或小,方案轻或重有关啦。

“明文”这事,在于你怎么看了。 HTTP 这类,不加安全套接字,传输的是“原始”数据,原始数据怎么传,是你控制的啊。前面有人也说了嘛,完全可以你自己设计流程,把数据加密后,通过 HTTP (或其它没有安全套接字的协议)传输。就是说,“加密”是应用层自己做的(而 SSL 的“加密”是在低下的会话层做的)。

具体来说,使用非对称算法,比如 RSA ,事先在客户端把公钥配置好,你就用 ws ,数据在发出前,用公钥加密,服务端收到数据,用私钥解密。如果你还怕中间的冒名劫持什么的,就把签名机制加上,服务端到客户端的数据作私钥签名,客户端用公钥验证。(你直接用 wss 就没这些麻烦事 )

@xia123zheng 你自己实现一遍就理解了吧,我说的协议是与http同一层的应用层协议,tcp是下一层了。

@yszou 谢谢大哥,讲解的太到位啦。我的眼界太窄了-。-,主要是我没有测试过呢,SSL认证需要money。。。而ws+加密算法,我怕应对高并发数据流的场景,影响性能,畏手畏脚。之所以纠结这,是因为关系到我毕业论文,所以还是得严谨一些嘛。最后再次感谢大哥们的耐心指导哈!~

@vincentLiuxiang 恩恩,谢谢大哥的耐心指导哈,是我的理解太浅了,只会用API还是不行。多探讨多学习~

你后段是nodejs咯,可以,主进程接收响应,子进程处理数据,

来自酷炫的 CNodeMD

@xia123zheng 是的。node程序员一直在招聘,欢迎投简历。

@xia123zheng

高并发,“流”式数据,那么自己作“加密”相关的处理,就更不可取了,前面说过了,这种方案自己要处理很多细节的问题的。 直接套 SSL 是最经济的办法。 如果你只是毕业设计什么的,证书可以自签,自己部署好流程上没问题的。证书怎么生成,部署,加密算法相关这一块,也可以系统了解一下。

@qujinxiong 嗯嗯,好的,若有机会,一定会投的哈~

@yszou 嗯嗯,我打算接下来系统的学下WSS的部署以及相关加密知识的学习呢,再次感谢node社区~~

回到顶部