默认
发表评论 13
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
求教关IM服务器的用户安全认证的常用做法
阅读(50645) | 评论(13 收藏1 淘帖1 1
神秘人  发表于 8 年前 倒序浏览 |阅读模式
刚开始做im,之前一直做web服务器,对im用户认证这一块不太了解,查了很多资料也都没有详尽的解释,在此向各位大神求助。
之前web使用session、token来做用户认证,每次请求都带上sessionid或者token,这都是很常见的做法,那现在im这边如何做呢?
每次发消息都带上sessionid或者token肯定是不现实的,增大包的长度和流量。
web端使用session或者token是为了防止session劫持、CSRF攻击、区分用户等,在IM这边验证用户名和密码成功才建立TCP连接,是否还存在什么安全问题?
有没有人能教我一个比较常见的IM用户认证的过程,劳烦各位大神!!!

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:即时通讯
上一篇:融联.云通讯 ios和android账号无法进行即时通讯下一篇:XMPP开源服务器Openfire组能支持多少人?

本帖已收录至以下技术专辑

推荐方案
评论 13
你对IM的理解可能有误区,IM跟Web有本质区别:因为IM的连接都是基于长连接的。

假设你用的是TCP协议实现长连接,一个最简单的认知就是:一旦建立长连接后,只要保证这个TCP通道不会被篡改,那么接下来的双方通信就是安全的,也就是说在这种情况下只要保证握手阶段或者说连接建立时的安全,数据传输时就不需要再进行什么认证了,因为建立连接后通道本身就是安全的(所谓的保证通道的安全,主流的作法是使用SSL/TLS安全协议来解决这个传输层安全问题(主要是防止数据被篡改)。至于连接时的安全认证,跟你传统的Web认证原理也就差不多了。)。

你可以详细参考一下微信的做法:http://www.52im.net/thread-310-1-1.html,理解一下。更多IM安全的资料在这里:http://www.52im.net/forum.php?mo ... w&ctid=6&fromop=all
其实我上面的回复里,如果是基于SSL/TLS,实际上它是在传输层帮你进行了加密并携带了安全有关的报文,但对于应用层来说,不需要做额外工作,相当于是透明的。不知有没有明白我的意思。

这主要是针对TCP协议了,但UDP协议就不是这样的,问题就复杂多了,至于UDP怎么样你暂时不需要考虑,因为你肯定会用TCP。
如果是webim的话,和前端页面通信的话,可以使用token值的,每个请求都带token值。其他端不了解。
引用:y510662669 发表于 2016-10-20 17:38
如果是webim的话,和前端页面通信的话,可以使用token值的,每个请求都带token值。其他端不了解。

我上面的讨论不是“可不可以”,而是“应不应该”的问题。你任何时候都可以带Token,哪怕是在使用SSL/TLS地时候。上面我说的情况,是讨论没有必要,理解下我上面的文字。
引用:JackJiang 发表于 2016-10-20 17:42
我上面的讨论不是“可不可以”,而是“应不应该”的问题。你任何时候都可以带Token,哪怕是在使用SSL/TLS ...

是应该的。很多大公司,在客户端和服务端建立TCP连接时,都会进行一次秘钥交换。服务端肯定要确定连接上来的这个tcp连接,是属于我客户端下的连接。一般都是一个userId标示一个TCP连接。
神秘人  发表于 8 年前
引用:JackJiang 发表于 2016-10-20 16:21
你对IM的理解可能有误区,IM跟Web有本质区别:因为IM的连接都是基于长连接的。

假设你用的是TCP协议实现 ...

感谢您的帮助,受益匪浅!
神秘人  发表于 8 年前
引用:y510662669 发表于 2016-10-20 17:38
如果是webim的话,和前端页面通信的话,可以使用token值的,每个请求都带token值。其他端不了解。

谢谢帮助!
引用:xxxx 发表于 2016-10-21 09:14
感谢您的帮助,受益匪浅!

不客气。
神秘人  发表于 8 年前
引用:JackJiang 发表于 2016-10-20 16:21
你对IM的理解可能有误区,IM跟Web有本质区别:因为IM的连接都是基于长连接的。

假设你用的是TCP协议实现 ...

群主还想问您个问题,我现在想的是客户端访问一个http服务器 然后返回一个负载较小的tcp服务器的ip和port,之后客户端再dial这个tcp服务器,那现在用户认证放在哪里比较好呢?如果放在http服务器 那知道了tcp服务器的ip就不需要认证了直接建立tcp连接了。如果放在tcp服务器还需要判断发来的消息是用户认证还是聊天信息,这样感觉不是很方便。请问还有什么更好的方法吗?
引用:xxxx 发表于 2016-10-23 20:01
群主还想问您个问题,我现在想的是客户端访问一个http服务器 然后返回一个负载较小的tcp服务器的ip和port ...

为了安全性,TCP服务器肯定不能让它裸奔。通常情况下都是先通过HTTP(更安全的是HTTPS)认证用户登陆信息,登陆成功拿到目标IM服务器的ip和port,但跟im连接时带着HTTP认证成功时返回的东西,它可能是个公钥,也可能是个跟Web应用差不多的token,im服务器再用这个东西跟http服务端(肯定跟http服务那连有个共享机制,可能是个redis缓存服务,也可能是个db)进行比对,合法才允许连接。

TCP这边的通信,为了防篡改,主流的都是用SSL/TLS作为传输层的安全保障。具体可以参考我整理的IM安全方面的文章:http://www.52im.net/forum.php?mo ... id=6&fromop=all
神秘人  发表于 8 年前
引用:JackJiang 发表于 2016-10-23 22:17
为了安全性,TCP服务器肯定不能让它裸奔。通常情况下都是先通过HTTP(更安全的是HTTPS)认证用户登陆信息 ...

谢谢回答!好文太多 收获很多,感谢您无私奉献!
神秘人  发表于 8 年前
引用:JackJiang 发表于 2016-10-23 22:17
为了安全性,TCP服务器肯定不能让它裸奔。通常情况下都是先通过HTTP(更安全的是HTTPS)认证用户登陆信息 ...

有个疑问。。tcp连接的时候又不能带参数,还是得先建立tcp连接以后再传这个公钥或是token来认证呀?
引用:xxxx 发表于 2016-10-23 22:58
有个疑问。。tcp连接的时候又不能带参数,还是得先建立tcp连接以后再传这个公钥或是token来认证呀?

是的,必须建立连接已后才能通信,才能携带你的合法身份信息,不然数据怎么可能双向交互。不合法的直接断开连接,真正的生产系统这一块会比较复杂,会有各种审记、反作弊和反攻击机制,当然还可以前置防火墙。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部