即時通訊(IM)軟件是大家最常用的通訊方式之一,可以說絕大多數的通訊都發生在即時通訊軟件上,這也就使得即時通訊的安全性十分重要。什么樣的即時通訊軟件是安全的?我們常用的即時通訊軟件安全嗎?
在討論即使通訊的安全性時,技術上主要從以下兩方面來評價:
加密性:IM軟件的加密性可以分為三個等級
- 無加密:早期的IM軟件(如MSN)沒有采用任何加密,聊天內容以明文的形式發送,這無異於在網絡上裸奔。
- 普通加密:現在的IM軟件大多實現了客戶端與服務器間的加密通信,盡管采用的加密算法各不相同,一般是將使用服務器公鑰進行加密后的信息傳送到服務器,服務器用自己的密鑰解密后再使用對話者的公鑰加密並發送到對方客戶端。這意味着服務器方是知道消息的具體內容的。但是這已經可以有效防止第三方竊取通信信息。有些IM軟件提供商聲稱不會保留聊天數據,但是顯然,他們是具有這個能力的。
- 端到端加密(E2EE):端到端加密直接使用對話者的公鑰進行加密,服務器方(如果存在服務器的話)只負責傳遞消息,並不能知道消息的具體內容。
匿名性:保持良好的匿名性,至少要在兩個方面保持匿名:
- IP地址:由於要與服務器或其他終端通信,必須提供IP地址。在普通加密中,這個IP地址會提供給服務器;在端到端加密中,IP地址會提供給通訊的對方。使用代理、Tor等工具就可以有效保護自己的IP。
- 身份信息:很多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是主流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