• 安全的即时通讯——基于分布式系统的Tox


    即时通讯(IM)软件是大家最常用的通讯方式之一,可以说绝大多数的通讯都发生在即时通讯软件上,这也就使得即时通讯的安全性十分重要。什么样的即时通讯软件是安全的?我们常用的即时通讯软件安全吗?


    在讨论即使通讯的安全性时,技术上主要从以下两方面来评价:

    加密性:IM软件的加密性可以分为三个等级

    1. 无加密:早期的IM软件(如MSN)没有采用任何加密,聊天内容以明文的形式发送,这无异于在网络上裸奔。
    2. 普通加密:现在的IM软件大多实现了客户端与服务器间的加密通信,尽管采用的加密算法各不相同,一般是将使用服务器公钥进行加密后的信息传送到服务器,服务器用自己的密钥解密后再使用对话者的公钥加密并发送到对方客户端。这意味着服务器方是知道消息的具体内容的。但是这已经可以有效防止第三方窃取通信信息。有些IM软件提供商声称不会保留聊天数据,但是显然,他们是具有这个能力的。
    3. 端到端加密(E2EE):端到端加密直接使用对话者的公钥进行加密,服务器方(如果存在服务器的话)只负责传递消息,并不能知道消息的具体内容。

    匿名性:保持良好的匿名性,至少要在两个方面保持匿名:

    1. IP地址:由于要与服务器或其他终端通信,必须提供IP地址。在普通加密中,这个IP地址会提供给服务器;在端到端加密中,IP地址会提供给通讯的对方。使用代理、Tor等工具就可以有效保护自己的IP。
    2. 身份信息:很多IM软件都需要强制绑定如手机号等身份信息,某些IM软件甚至会主动搜集用户信息。

    接下来,以这两项为标准来分析一些常用的IM软件:

     

    QQ和微信

    QQ

    QQ和微信都使用普通的加密。虽然腾讯声称“微信不储存用户聊天记录”,但是在很多案例中我们都看到了从非用户本人渠道获得微信聊天记录。

    QQ和微信都要求用户绑定手机号。

    • 加密性:一般
    • 匿名性:差
    • 总体安全性:差

     

    谷歌环聊(Google Hangouts)

    谷歌环聊

    谷歌环聊采用普通的加密,声称自己不储存聊天记录,但是谷歌有过储存用户聊天记录的历史。谷歌公司参与了棱镜计划,但是还没有证据显示谷歌环聊受到棱镜计划的监控。

    • 加密性:一般
    • 匿名性:好
    • 总体安全性:较好

     

    Skype

    Skype

    Skype采用普通加密,从2018年开始试用端到端加密,但是还在测试中。

    Skype中国版会对特定信息进行监控和储存,国际版则受到美国国家情报局的大规模监听。

    • 加密性:较好
    • 匿名性:好
    • 总体安全性:一般

     

    LINE

    LINE

    LINE使用普通加密,也可以选择开启端到端加密。LINE上的通信会受到韩国国家情报院的监听。

    韩国国家情报院

    LINE账号必须绑定手机号或邮箱。

    • 加密性:较好
    • 匿名性:差
    • 总体安全性:一般

     

    Telegram

    Telegram

    Telegram将端到端加密作为其一个宣传点,但是Telegram只有在使用“秘密聊天”时才使用端到端加密,而在其他情况下无论是私聊还是群聊都是普通的加密。

    Telegram的客户端是开源的,服务器端是专有的;因此仅仅客户端的开源并不能让我们信任服务器端。

    总的来说,Telegram并没有其宣传的那样安全。

    Telegram只在本地保存聊天记录,但是频道和群聊的聊天记录是在服务器上保存的。

    Telegram需要绑定手机号。

    • 加密性:较好
    • 匿名性:差
    • 总体安全性:较好

     

    WhatsApp

    WhatsApp

    WhatsApp是主流IM软件中唯一一个强制启用端到端加密的,而且WhatsApp还支持群聊的端到端加密。

    Facebook加入了棱镜计划,但是端到端加密是无法被监控的。

    WhatsApp需要绑定手机号。

    • 加密性:好
    • 匿名性:差
    • 总体安全性:好

     

    IM软件的总体安全性还有一些其他判断标准,在这里列出:

    各IM软件特性表

    上述的各商业IM软件的安全性都有着同样的弱点:

    • 专有的:除了Telegram的客户端是开源的,其他软件都是专有的,这不仅不符合避免"隐蔽式安全"的原则,而且给了这些商业公司留后门的机会。
    • 受监控:以商业公司服务器为中心的通信很容易受到监控,尤其是美国的棱镜计划。目前只有Telegram没有被曝光与任何监控计划有关,但是Telegram一直在关闭、封锁恐怖组织的频道和账号。

    棱镜计划


    在棱镜计划被曝光后,大众对商业公司的IM软件失去了信任,为了更安全的即时通讯,Tox诞生了。

    Tox

    与传统的IM软件相比,Tox有以下特性:

    • P2P:Tox是一个分布式,P2P的系统,不依赖于任何中央服务器,所有通信使用端到端加密,这也就根绝了受监控、绑定个人信息、保存聊天记录等危险。
    • 开源:Tox是一个开源项目,其源代码全部公开,避免了植入后门的危险。

    Tox本身只是一个通讯协议,在此基础上开发出了Tox核心(Core)——一个包含创建的协议和应用程序接口的程序库,而在这之上有各种版本的客户端。这些客户端大多也是开源的。在Windows系统上表现最好的客户端是qTox。

    qTox

    为了了解Tox的工作原理,接下来对Tox核心的主要模块做一个简单的介绍。

     

    加密核心(Crypto Core)模块

    Tox的加密依赖于NaCl加密库,加密核心模块对此进行了一些封装,从而为一些加密相关的函数提供一些很好的接口。

     

    网络(Network)模块

    网络模块封装了UDP套接字,可以与操作系统底层的套接字函数进行交互,从而为UDP套接字和其他网络相关功能提供了简单的接口。

     

    分布式散列表(DHT)模块

    分布式散列表是Tox实现分布式的核心模块,他用来将一个关键值(key)的集合分散到所有在分散式系统中的节点,并且可以有效地将讯息转送到唯一一个拥有查询者提供的关键值的节点(Peers)。这里的节点类似散列表中的储存位置。DHT被广泛应用于各种分布式系统中,比如常用的下载协议BitTorrent。

    DHT模块是Tox网络中所有节点的自组织群体。 该模块负责查找对等端的IP和端口,并在需要时通过UDP建立路由。 DHT只在UDP上运行,所以只在UDP启用时才会使用。
    Tox DHT中的每个节点都有一个临时公钥。 该DHT公钥充当其地址。 该地址是临时的,每当关闭或重新启动Tox时都会更新。

    分布式散列表(DHT)

     

    洋葱(Onion)模块

    使用洋葱模块可以找到好友的DHT公钥。 一旦知道了朋友的DHT公钥,就使用DHT找到它们并通过UDP直接连接到它们。

    Tox中的洋葱模块的目标是防止非好友节点从节点的已知长期公钥中找出临时DHT公钥,并防止对方在知道临时DHT公钥的情况下找到长期公钥。

    它确保只有节点的好友才能找到并连接到它,并间接确保非好友即使知道Tox地址也无法获取到IP地址。

    防止网络中的节点将临时DHT公钥与长期公钥关联的唯一方法是不广播长期密钥,对于非好友节点只使用临时DHT公钥。

    洋葱模块允许节点分享他们的好友的他们的DHT公钥以让别人可以找到并连接到他们,但这些陌生人是无法获得长期公钥的。

    那么洋葱模块是如何工作的?

    洋葱模块的工作方式是让节点通过洋葱路由向好友宣布他们真正的公钥。它就像一个使用洋葱路由的DHT。事实上,它使用DHT,以便让其他节点能够通过洋葱路径找到最接近其公钥的ID。

    为了在使用洋葱模块时匿名地向Tox网络公布其真实的公钥,它首先挑选3个它知道的随机节点(它们可以来自任何地方:DHT,连接的TCP中继或找到与洋葱同级的节点)。应该选择那些不太可能由同一个人操作的节点,可以通过查看IP地址或其他方式并查看它们是否处于相同的子网。

    选择3个节点的原因是Tor和其他基于洋葱路由的匿名网络也是这样的。

    洋葱模块的匿名方式仿照了洋葱路由(Tor)

     

    网络加密(Net Crypto)模块

    Tox传输协议是Tox用来安全地将数据安全地发送给朋友并提供加密,有序传送以及完美的前向保密的协议。它是一个UDP协议。

    Tox传输协议具有在找到两者之间的路由或通信链路后安全地连接两个节点(tox好友)的功能。此外,如果节点知道他们想要连接的节点的真实公共密钥和DHT公共密钥,则只能使用Tox传输协议连接到另一方。但是,DHT需要这些信息才能找到并打开到节点的路由,这意味着我们假设该信息由toxcore知道,并且在创建net_crypto连接时已传递给net_crypto。

    由于此协议必须通过UDP工作,因此它必须考虑到可能的数据包丢失,或者数据吧以错误顺序到达,并且必须实施某种拥塞控制。这是在数据包被加密的前提之上实现的。

    在发送实际的握手数据包之前,对等方必须获得一个cookie。此cookie用于确认对方确实可以响应以防止某些类型的DoS攻击。

    接收cookie请求数据包的节点不得为连接分配任何资源。他们只会用包含cookie的cookie响应数据包做出响应,然后请求的节点必须在握手过程中使用该响应数据包来启动实际的连接。

    必须使用cookie请求数据包发送的完全相同的链接发回cookie响应。其原因是,如果使用另一个链接发回它,另一个链接可能不起作用,并且节点不会期望来自另一个链接的响应。例如,如果使用ip端口X从UDP发送请求,则它必须由UDP发回到IP端口X。

    当接收到cookie请求时,对方不得在请求数据包中使用任何信息,而且不能存储它,他只能创建一个cookie和cookie响应,然后发送创建的cookie响应数据包并忘记它们。这是为了防止可能的攻击。例如,如果对等方为每个接收到的cookie请求数据包分配长期内存,那么简单的数据包泛滥就足以通过使程序内存不足而实现有效的拒绝服务攻击。

    握手过程

    好友请求(Firend Request)模块

    当Tox用户向Tox添加某人时,toxcore会尝试向该人发送朋友请求。好友请求包含发件人的长期公钥,nospam混淆码和消息。

    传送长期公钥是好友请求的主要目标,因为节点找到对方并建立连接的前提。长期公钥是接收者接受好友请求时添加到他的好友列表中的内容。

    nospam是一个用于防止骚扰的混淆码。它确保只有看过好友的Tox ID的人才能向他们发送好友请求。 nospam是Tox ID的组成部分之一。

    nospam是由节点设置的一个数字或一个数字列表,只有收到的包含由相同设置的nospam的朋友请求才会发送到客户端,让用户接受或拒绝。 nospam防止网络中的随机节点将好友请求发送给非朋友。 4个字节足够大以防止来自网络中随机节点的垃圾信息。 nospam还可以允许Tox用户发布不同的Tox ID,甚至在有人发现Tox ID并决定向其发送数百个垃圾好友请求时更改Tox ID。更改nospam可以阻止垃圾好友入侵,而不会对用户朋友列表产生任何负面影响。例如,如果用户不得不改变他们的公共密钥以防止他们接收到朋友请求,这意味着他们将必须放弃他们所有的当前好友,因为好友与公共密钥相关联。一旦好友互相添加,nospam就不会被使用,这意味着改变它不会有任何负面影响。

    NoSpam混淆码

     

    好友连接(Friend Connection)模块

    好友连接模块是位于DHT,洋葱和网络加密模块之上的模块,负责将3个模块连接在一起。

    好友连接模块负责建立与好友的连接,并为上层联系人模块提供一个简单的界面来接收和发送消息,添加和删除朋友并知道朋友是连接(在线)还是未连接(离线)。

    好友连接模块中的好友由其真实公钥代表。当好友连接模块添加好友时,会为该好友创建一个洋葱搜索条目。这意味着洋葱模块将开始寻找这个朋友,并且向该朋友发送DHT公钥。

    一旦洋葱模块返回对方的DHT公钥,DHT公钥将被保存,并添加到DHT好友列表中,并创建一个新的网络加密模块连接。然后好友连接模块会将好友的IP /端口传递给网络加密模块,如果它断开连接,也将其保存为用于重新连接到好友。

    如果网络加密模块发现该好友具有不同的DHT公钥(如果该朋友重新启动其客户端就可能发生),则网络加密模块会将新的DHT公钥传递给洋葱模块,并将删除旧的DHT公钥并将其替换为新的。当前的网络加密连接也将被终止,并且将会创建一个具有正确DHT公钥的新连接。

    当朋友的网络加密连接上线时,好友连接模块会告诉洋葱模块该好友在线,以便它可以停止花费资源寻找好友。当朋友连接离线时,好友连接模块会通知洋葱模块,以便它可以再次开始寻找朋友。

     

    联系人(Messenger)模块

    联系人是最顶层的模块,联系人模块使用好友连接模块提供的连接来处理发送和接收消息。该模块为好友提供了一种连接方式,并使其可用作即时通讯工具。例如,联系人模块允许用户设置昵称和状态消息,然后在联机时将消息发送给好友。它还允许用户向好友发送消息,并在较低级别的好友连接模块上建立即时通信系统。

     

    群聊模块

    Tox中通过使用好友连接模块添加一些节点(最多4个)作为临时聊天,在退出群聊时删除群聊。

    群聊中的每个节点都由其真实的长期公钥来标识,但是节点通过群聊将对方的DHT公钥发送给对方,以便通过使对等方无需找到对方的DHT公钥来加速连接。如果他们将自己添加为好友,则会使用洋葱模块。

    使用好友连接模块的好处在于,群聊不需要处理底层网络连接上。然而,不利的一面是,每个人都知道彼此真正的长期公钥和DHT公钥,这意味着这些群组聊天只能在好友之间使用。

    为了彼此连接,两个节点必须将另一个添加到他们的好友连接列表中。如果群组聊天的参与者数量等于或小于5,则这不是问题,因为5个节点中的每个人都将其他4个人添加到他们的朋友连接列表中。当有更多的节点时,必须有一种方法来确保节点能够连接到其他群聊节点。

    要使用群聊,必须首先创建一个群聊,然后邀请好友加入群聊。

    要创建一个群聊,节点会生成一个随机的32字节的ID,用来唯一标识这个群聊。 32字节就足够了,每个创建的组聊天都会有一个不同的ID。这个32字节ID的目标是让节点有一种识别每个群聊的方式,以免他们重复加入群聊。


    除了使用UDP连接,Tox还可以使用TCP连接,但是此时Tox会变成一个中继节点,对于TCP相关的模块不作介绍。

    需要注意的是,Tox不能提供匿名性——你的好友必须要知道你的IP地址,才能给你发送信息。使用代理或者Tor可以很好的解决这一点。

    来源:https://zhuanlan.zhihu.com/p/34477792?edition=yidianzixun&utm_source=yidianzixun&yidian_docid=0IWoFWSo

  • 相关阅读:
    WINDOWSXP文件夹右键属性没有“安全”选项卡的解决
    无法为类型 CuteEditor.Editor 授予有效的许可证。
    DSO Framer _ WebForm 使用
    sql语句中日期时间格式化查询
    url 编码 中文|c# js url传参中文乱码解决方案
    UML中类图实例(转载)
    JavaSE重点——注解和反射
    JavaSE重点——内部类(转载)
    JavaSE重点——Java8新特性
    JavaSE重点——网络编程
  • 原文地址:https://www.cnblogs.com/gao88/p/11651386.html
Copyright © 2020-2023  润新知