野火安全吗?

先说结论:非常安全!下面讲一下野火信令交互加密的方式,相信讲完之后您就理解了。

1. 密钥

野火IM内有三类密钥,一个是全局密钥,全局只有一个;另外就是会话密钥和DB密钥,一个用户在一个设备上对应一个session,每个session存在一个会话密钥密钥和一个DB密钥。同一用户在不同设备上就是不同的session,这两类密钥也就不同;不同的用户在同一个设备上也是不同的session,同样密钥也不相同的,但一个设备上同时只能有一个激活的会话。会话密钥和DB密钥都是UUID,不可能被穷举。下面会讲怎么使用这及个密钥。

2. 会话生成

GetToken接口是唯一创建会话并生成密钥的地方,Server API的端口是18080,这个接口只给应用服务使用,可以设置复杂的加密Key和严格的防火墙策略,只允许应用服务访问这个端口。这样即使离职员工拿到您的所有信息,能够伪造token(后面会讲到)和生成密钥也无法生成会话来攻击系统。

3. 长短链接

我们协议栈使用了微信mars连接库,它有个特点是支持长短链接。相关信息可以自行查阅,这里简单介绍一下:

  1. 协议栈保持一条与IM服务的长链接通道(TCP长链接,1883端口),平时客户端到IM服务器的请求和全部的IM服务到客户端的推送。特点是连接保持存在,每次请求的开销小,响应快速,但如果大量请求(比如刚打开应用时,会同时请求用户信息,群组信息,设置等)可能会产生排队问题,影响用户体验。
  2. 为了解决这个问题就引入了短链接的功能(HTTP请求,80端口),当长链接队列超过一定长度后,其它请求就走短链接,缺点是开销大,每个请求都要建立/释放链接,但优点是可以大量并发,能够快速响应用户。

因此长短结合能够最大程度地兼顾效率和用户体验。在长链接和短连接加密策略稍有不同。

4. 密钥的分发

全局密钥简单,固定在IM服务代码中和客户端协议栈内。会话密钥和DB密钥是在会话第一次创建时生成的,这两个密钥包含着im token中(以后简称token)。在客户端SDK中是不存储这个token的,为了确保密钥的安全,需要确保token从IM服务到SDK的过程完全保密。一般情况下的流程是客户端到应用服务登录,应用服务认证过后去IM服务获取token,应用服务把获取到的token返回给客户端,客户端调用connect接口把token传给SDK。因此需要下面3个环节的安全:

  1. 应用服务与IM服务之间:确保在一个内网之中,确保网络安全。
  2. 客户端与应用服务之间:使用HTTPS
  3. 应用与SDK:应用需要安全地处置token,不能直接存储在某个地方。

SDK拿到token后就解开密钥,再使用会话密钥做对称加密进行交互。这有点儿像tls协议,双方先用很重但很安全的非对称加密方式交换对称加密密钥,然后再用对称加密密钥进行沟通。只不过我们第一步交互密钥是通过应用层https实现的。

5. 会话密钥的使用

5.1. 长链接的密钥使用

建立链接时,connect消息有2个重要的信息,clientId和payload。clientId是经过全局密钥加密的,payload是用会话密钥加密的。当IM服务收到请求时,会根据clientId找到对应会话,取出会话密钥,然后去解密。如果解密成功,会获取到对应的内容,继续鉴权流程。如果解密失败,则返回给客户端错误码,客户端则需要重新登录(重新获取token)。当长链接建立完成后,服务端长链接就与会话对应起来了,之后所有的交互的重要内容都是经过会话密钥进行加密的了。因此可以看出即使全局密钥泄漏也不会造成任何问题。

5.2. 短链接的密钥使用

短链接就是HTTP请求,所有的请求都会有个head带有客户端的clientId,这个也是经过全局密钥加密的,其它信息则经过会话密钥进行加密放到http body内,通过post方式请求到IM服务。同长链接的connect处理过程一样,根据clientId找到对应的session获取会话密钥,再根据会话密钥来解body内容。因此可以看出即使全局密钥泄漏也不会造成任何问题。

因此即使全局密钥泄漏,黑客唯一能够拿到的就是一个clientId,其它任何事情都不能做。

6. 防重放攻击

野火所有的信令都带有额外信息来避免了重放攻击,带来的一个副作用就是需要服务区和客户端都是时间正确的,不能误差太多。

7. 数据库密钥的使用

客户端数据库使用了sqlcipher进行加密,安全强度是非常高的。加密密钥就是前面提到的DB密钥,同会话密钥一样,SDK没有存储token和DB密钥,需要应用层把token传给SDK,只要应用层确保token的安全,数据库就是安全无法破解的。

8. 文件传输的安全

请参考文件存储的安全性问题里提到的处理流程。野火私有存储同短链接一样,上传时有个全局密钥加密的clientId,内容则用会话密钥加密,野火私有存储服务收到请求后,会去IM服务(server api或者直接读取数据库)获取到会话密钥。使用会话密钥去解密。

9. 未来增强

使用会话密钥都是通过AES加密的,理论上AES的安全性很高,但还是可以通过超级计算机来破解的,因此定期更换会话密钥也是需要的。野火准备加上密钥更新策略,以一定周期频率来更新会话密钥,确保万无一失。

10. 总结

野火IM能够做到信令加密,文件传输加密,客户端数据库加密,安全处理流程无漏洞,野火IM是安全的!

2018 © wildfirechat.net 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2021-03-04 09:10:58

results matching ""

    No results matching ""