riot是一个开源的去中心化聊天工具,提供了一个聊天的底线解决方案。

分布式

和大部分IM工具不同,riot的用户,是属于某个特定的服务器的。我们可以对比一下Email和QQ。Email里,你可以选用不同邮箱,不同邮箱之间是可以互相发送消息的。而QQ里,你的帐号必然只能在腾讯的体系里。前者,我们认为是一个分布的系统。用户分布在多个组织里,依靠协议互相通讯。后者,我们认为是集中的,供应商掌控一切。也许你会反驳说,QQ也分布在全国多个节点。这是对的,但是这是腾讯自己的分布,而不是用户的分布。用户对这事是没有感知的,也无权选择。

riot是一个用户分布式的IM系统。你需要找一个服务商,然后向他注册。就像你找一个邮箱供应商并注册一样。随后你会获得一个用户名和密码。配置用户名和密码,你就可以在各种地方登录。Windows,Mac,Linux,Android,iOS,web,我至少知道这几种客户端。登录之后,你可以找任何人聊天,哪怕他和你不在一个服务器。服务商会连接对方的服务器,并完成通话准备。如果你懒得找,riot.im官方也提供注册。你可以把他视为最大的供应商。

和印象相反,用户分布式的系统,听上去很高大上,其实是比集中式难用的。因为分布式系统依靠的是协议,而协议是很难更新的。只有大多数人跟进,一个特性才有用。就像反垃圾邮件,已经好几年了,推进仍然有限。而集中式体系则不然。只要供应商想,他们就可以不停升级协议。你现在还能用12年版的QQ协议么?不行了对吧。这样就使得一个新特性可以在很短时间内铺开。

那么分布式的好处在哪里?

分布式的用户体系,提供了一种可能性。即使在一个供应商出现种种问题的情况下,整个通讯系统依然不崩溃。你甚至可以换一家供应商,然后重新联系你原来的好友——只要你有好友的通讯录备份。这使得保持协议的同时更换供应商成为了可能——一种永远不可能在腾讯体系内实现的可能。

也许你会觉得,供应商会出什么问题?嘛,我们依然以腾讯为例。在中国,腾讯占有了很大的IM和游戏市场份额。作为腾讯的对手,你要警惕的不仅是企鹅帝国的挤压,还有,你要用什么IM作为办公工具。如果您依然认为QQ是个好选择,我只能祝愿您好运。当然,也许您会觉得,我们可以用钉钉。嘛,我也祝愿您好运。这是一个信仰问题,您开心就好。

riot的特性在此时就非常有用。你可以搭建一个自己的聊天服务器,自行维护。自然,此时就没有坑爹的国际线路问题,也没有企鹅运营问题。甚至,如果上下游的公司也选用了支持riot协议的体系,你们还能直接互相聊天。当然,在中国微信和QQ包打天下的格局下,这种情况基本是不大可能了。

类似的场景还有,如果你觉得企鹅家会在聊天记录里搞事。担心聊天记录泄密。严重洁癖甚至都不相信telegram。那么riot的纯开源自维护体系应该能让你感到满意。但是一切的一切,最关键的一点在于。只有你对聊天的供应商有选择权,供应商才会真正“听”你的话。在一个无法离开的体系里,只会变成:用户你好,我是你爸爸。

当然,使用riot要注意他的几个缺点。首先,riot的各个客户端维护的比较差。难看,功能有限,而且不稳定,修复时间长。其次,riot和现有的主流用户完全隔离,这对销售来说非常致命。

安全特性

riot的聊天是非加密的,对此你不应该感到意外。riot的安全是额外提供的,你必须手动打开。riot的加密系统非常有趣,不是基于用户的,而是基于设备。这种加密被称为E2E加密,意思是端到端。

手机在选项里拉到底,可以看到把对话转换为加密对话的选项。需要注意的是,打开E2E加密后,这个对话是不能转回去的。你可以开个新对话,把所有人都加进去。但是这个已经存在的对话本身是不能转换回去的。另外就是,由于E2E加密需要端点支持,所有web原则上是很难做出E2E的。因此web版本上这个功能基本是废的。

当你用一个新的终端登录,例如一台新手机连入的时候。所有人会看到你这个新终端,并选择是否信任你。如果他们信任你,那么你可以看到他们说的话,这个都能理解。如果他们不认可你呢?默认情况下也能看到。这是因为系统里有个选项,默认发消息给所有未信任终端。关闭之后,那些你不认可的人就看不到你讲的话了。当然,在进去的同时,你也会看到里面所有的端,并选择是否信任。

当你更换了一个客户端,例如换了一台手机。默认情况下,视同一个新手机登录,所有人都要重新信任,而且所有之前讲的话都会无法浏览。注意,哪怕在同一个手机上,当登出再登录时,也视同一个新客户端。所有人都要重新信任,之前所有会话无法浏览。如果要避免这个问题,你需要在登出前先导出自己的E2E密钥,登录后导入。

这里就要说一下用法问题了。首先,请关闭“发送消息给所有未信任终端”的选项。新用户无法查看之前的消息,但是能查看新的?这个简直了。其次,一开启E2E,就要导出密钥并妥善备份。否则每次都要重新认证终端,对其他人很不友好,而且不安全。第三,不要随便认证终端,一定要确保对方是本人。你可以问一些只有你们知道的问题,或者干脆看着他互相认证也行。

E2E加密的基本原理是,每个端携带一个密钥,进入聊天时把自己公钥发送出去。如果说话的人信任你这个终端,那么他就会认可你的公钥。客户端就会使用你的公钥加密发出去的信息,你在接受到之后就可以用自己的私钥解密。如果他不用你的公钥加密发出去的消息,那么你就看不到,或者说看不懂。

透过这个机制,我们可以理解上面如此设定的机理。当初次进入聊天时,虽然你可以从服务器端同步所有历史消息。然而由于这些消息都没有用你的key加密过,所以你看不懂。当对方开始用你的key加密消息了,你就可以看懂消息了。当登出时,未保存的E2E key会被丢弃。

E2E对抗的风险,就是服务器不可靠,例如被攻陷。或者用户不可靠,例如密码泄露。即便在服务器被攻陷,或者某个用户密码的情况下。E2E机制依然能让攻击者无法看到加密的消息(注意,这里前提就是你关闭了“发送消息给所有未信任终端”)。因为加解密都在客户端做,所有服务器端看到的消息本身就是一团乱码。攻击者拿到密码后,伪装客户终端进来。然而这个终端由于没有信任,因此既看不到历史记录,也看不到新消息。能够对付E2E机制的,只有导出的密钥备份丢失而且被破解,或者直接拿到终端。或者更干脆,聊天中某个人变节,把记录全部发了出去。