XMPP 即時通訊進階資訊整理


本文將額外補充一些有關 XMPP 的注意事項。內容將會比較零散。

本文假設你已經對 XMPP 有了一定的認識。


其他有關 XMPP 的優點#

低註冊難度#

也許有鑑於伺服器的低資源佔用,公開的 XMPP 服務有很多,幾乎所有都不問手機號碼,甚至連 Email 也不問。很多也沒有引入像 reCaptcha 或 hCaptcha 的第三方驗證(這些不只是麻煩,更有隱私問題)。通常 XMPP 的註冊只需要填帳戶,密碼,和簡易的 Captcha。

無須過於信任服務提供者#

網上任何的服務都會要求用戶對它有某程度上的信任,而 XMPP 也不例外。假如不幸你選擇的服務提供者是別有居心的人,可以得到你哪些資訊?以下為一些例子:


  • XMPP 聯絡人清單
  • 加入過的 XMPP 聊天室清單
  • 聊天記錄
  • XMPP 用戶端透露的資訊(用戶端的識別 ID、名字、時區、作業系統等)
  • 其他(IP 位址等)

聊天記錄可透過端對端加密解決,使用自由軟體、對用戶隱私友善的用戶端也能減少資訊透露。只有 XMPP 聯絡人和聊天室清單是不能對服務提供者隱藏的。


其他常見用語#

  • JID
    • 像這樣的格式:jid@server.tld
    • 又稱 XMPP 位址、XMPP 識別符、Jabber ID
  • MUC
    • Multi-User Chat,多人聊天室

使用 XMPP 時的注意事頂#

傳輸加密#

XMPP 的聊天即使未啟用端對端加密,TLS 傳輸加密仍然是有效的(與日常網頁使用的 HTTPS 類似),除非你在用戶端特意把 TLS 加密關閉。你與你伺服器之間的通訊仍然受到加密保護,但伺服器的擁有者有能力閱讀你的訊息。


內容加密#

內容加密保證只有對話目標才能讀取內容。其他所有人,包括伺服器的管理員,將只會看到亂碼。

參見:https://wiki.xmpp.org/web/XMPP_E2E_Security

TL;DR:用 OMEMO 就好了。OpenPGP 和 OTR 在大部分情況都沒有那麼方便。

為了測試目的,我試過在自己的 Prosody XMPP 伺服器查看聊天日誌,找到了本人對本人自己(不同 JID)的對話。

item({
	{
		"I sent you an OMEMO encrypted message but your client doesn\226\128\153t seem to support that. Find more information on https://conversations.im/omemo";
		["attr"] = {};
		["name"] = "body";
	};
	{

"I sent you an OMEMO encrypted message 這句意思是「我發了你 OMEMO 加密訊息但你用戶端似乎不支援」。當然這不是原本的信息。

(以下為一些 Metadata,這裡的資料我有另外處理過)

        ["attr"] = {
		["to"] = "XXX@server.tld";
		["type"] = "chat";
		["from"] = "YYY@server.tld/resource";
		["xml:lang"] = "en";
		["stamp"] = "YYYY-MM-DDTTime";
		["id"] = "[...]";
	};
	["name"] = "message";
	["with"] = "XXX@server.tld";
	["when"] = "[...]";
	["key"] = "[...]";
});

以上為 Metadata(元資料)能透露的信息。目前 XMPP 使用的加密協定一般都不支援加密元資料。OMEMO 的新版本(以下稱 OMEMO 2)依乎想解決這問題。

目前已知 Kaidan 支援 OMEMO 2,雖然把元資料也加密是一項改善,可是根據 Kaidan 的說法,OMEMO 2 與舊版 OMEMO 1 並不相容,彼此讀取不了信息。由於這是比較新的改動,現在我整理不到狀況。只希望各用戶端開發者在追加 OMEMO 2 支持的同時仍保留對 OMEMO 1 的支持。

OMEMO#

https://conversations.im/omemo/

OMEMO 是 XMPP 中最常見的內容加密協議。支援「前向保密/Forward Secrecy」。

OMEMO 裝置指紋#

指紋格式如下。X 為英數字:

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

每一個「身份(session)」都有自己的指紋。​舉例:

  • 不同裝置/OS/用戶端登錄都會被視為一個新的「身份」
  • 相同裝置,OS 和 用戶端,但只要用戶端上的資料被洗掉後再登錄,就會被視為一個新的「身份」
指紋信任#
  • 信任/Trusted
  • 不信任/Not Trusted
  • 待決定/Undecided
    • 發現新指紋的狀態

只有被你信任的「身份」的裝置才能解密你所發送加密內容。

「待決定」狀態的行為視乎你在用戶端上的設定。

  • 如果設定了「盲目信任(Blind Trust Before Verification)」,用戶端會自動信任所有新「身份」。
  • 否則,會被視為不信任。信任必須手動進行。

Blind Trust 很方便,如果只需要「Trust on first use」的情境時是沒有問題的。可是如果你要驗證對象身份時這就會令加密失去意義了。因此我是建議手動信任的。

支援度#

作為實質上的加密標準,很多用戶端都已支援 OMEMO。參見:Are we OMEMO yet?


OpenPGP#

https://www.openpgp.org/about/standard/

OpenPGP,在一些用戶端上有時候可能名字會被略寫成 PGP。

相比 OMEMO,PGP 不支援「前向保密/Forward Secrecy」。一旦因某些原因被偷去了私鑰的話,舊有對話都可以被解密,因此私鑰必須小心保管。

公鑰和私鑰的概念可參考: 基礎密碼學(對稱式與非對稱式加密技術)

OpenPGP 在 XMPP 有兩種協定:XEP-0027XEP-0373。前者已被 XSF 視為廢除,可是大部分用戶端都不支援後者。

XEP-0373 相比 XEP-0027,除了進行加密外還會進行簽名。這樣你可以知道訊息是否真的是密鑰持有人發送。參見:XMPP E2E Security

用法#

使用時自己必須要有 PGP 公鑰和私鑰。然後導入對方的 PGP 公鑰。對方的公鑰通常可以在對方網站,金鑰伺服器(Key Server)等地方找到(視乎對方發佈公鑰的方式,例如本人的話是放在聯絡頁面中)。

密鑰對(公鑰和私鑰)的生成和導入,不同的用戶端有不同做法。有些用戶端可以自動生成和導入公鑰,有些則要手動。

支援度#

XEP-0027 的話很多用戶端都已經支援,但 XEP-0373 目前支持的還是很少,似乎只有 Gajim。


OTR#

https://otr.cypherpunks.ca/

不支援離線通信,某程度上也被 OMEMO 取代了。很多現代的 XMPP 用戶端已放棄支持。(個人是覺得多個選擇也不壞)


聊天室#

聊天室也是擁有 JID 的。要進入聊天室在用戶端中輸入聊天室的 JID 即可。聊天室內主要是以「暱稱(nickname)」去分辨身份的。

一些公開的聊天室可以在此找到:https://search.jabber.network/

聊天室種類#

詳細請參見:XEP-0045

可視性#
  • 公開/Public;隱蔽/Hidden
    • 公開即是聊天室可以被搜索(以「Disco」等方式)
用戶許可性#
  • 開放/Open;成員限定/Members-Only
    • 開放即是任何不在黑名單內的用戶都可參與
用戶驗證#
  • 無需驗證/Unsecured;密碼保護/Password-Protected
發言權限#
  • 無發言限制/Unmoderated;有發言限制/Moderated
    • 有發言限制即是只有被管理員允許「發聲(voice)」才可以說話。(不適用於私信)
匿名性#
  • 半匿名/Semi-Anonymous;非匿名/Non-Anonymous:
    • 半匿名即是 JID 只對管理員公開。其他用戶只能見到「暱稱(nickname)」
    • 非匿名則是 JID 對任何參與者公開。其他用戶能見到「暱稱(nickname)」和 JID

聊天室的內容加密#

一般來說,公開的聊天室並不會使用端對端內容加密。既然是公開的,加密除了讓人讀不了以前的信息外就沒有意義了。而且如果要每人都讀得到信息,每一個用戶都必須知道其他所有人的 JID。如果人數比較多的話會很麻煩且只能在非匿名聊天室實現。

聊天室的端對端加密目前只有 OMEMO 支援。


加入聊天室前的注意事項#

因為只要加入了聊天室,JID 就會被管理員或更多的人看見(視乎聊天室設定),而 XMPP 跟 Email 和其他互聯網上應用一樣,存在著專門用來發送詐騙或垃圾信息的帳號。如果不希望自己的 JID 被太多人知道,就儘量不要亂入聊天室,並預先查看聊天室的設定。


隱私設定#

很多用戶端的初始隱私設定都不太好,因此建議在開始使用前,先按自己喜好調整設定。

「自動離席狀態」,允許發送「正在輸入 …」,「已讀標記 」狀態等等,這些通常都可以調整。

有些用戶端也會公開一些有關你裝置的資訊:時區,作業系統,用戶端以及其版本。有些用戶端可以在設定中隱藏全部或一部分,但可惜的是 Android 的用戶端全部都沒有這些隱私設定。


信息回收#

在去中心化的系統上,理所當然地信息一旦送出就不能修改或回收。有些用戶端有所謂「修改」的功能,但實際上只是重發並標記它是修改後的信息。


常見用戶端的資訊補充#

除了之前介紹過的 Gajim,Dino,Conversations(和 monocles chat),XMPP 還有其他各種各樣的用戶端。以下補充常見但個人沒有推薦的用戶端。

Psi+#

Psi+ 介面 (https://psi-plus.com/wi/psiplus_screen_sky_win_big.png) Psi+ 介面 (https://psi-plus.com/wi/psiplus_screen_sky_win_big.png)

插件量、可設定的功能非常多。預設介面比較古老。另有穩定版的 Psi

致命缺點是,如果嘗試用 OMEMO 加密檔案上傳的話會令用戶端崩潰,而且不支援群聊 OMEMO 加密。

支援平台:Windows、macOS、Linux、FreeBSD、Haiku

加密支援 (測試版本:1.4.554)

  • OMEMO
    • 非常可惜、似乎不能用在檔案上傳(會令用戶端崩潰)
    • 不支援群聊OMEMO加密
  • OpenPGP (XEP-0027)
  • OTR

Psi(沒「+」的暫不支援 OMEMO。要以後發佈 2.0 版才有。

隱私度:良好

  • 時區、作業系統、用戶端及其版本:預設公開、但可透過設定和「Client Switcher」插件使其不公開。
    • 有趣的是、「Client Switcher」可以令你某程度上偽裝成其他用戶端(但 Gajim 仍可以透過「Clients icons」插件間接地分辨出來)。

官方網站https://psi-plus.com/


Pidgin#

Pidgin 介面 (https://pidgin.im/about/pidginchat/general-chat.png) Pidgin 介面 (https://pidgin.im/about/pidginchat/general-chat.png)

Pidgin 的特點是多協議支援(可以不只用 XMPP)。但我認為 Pidgin 隱私度不太好,尤其與其他桌面用戶端相比。

OMEMO 支援也似乎不全(?)。如果對端對端加密有需求,不推薦。

支援平台:Windows、macOS、Linux、FreeBSD

加密支援(未親自測試)

隱私度:一般

  • 時區、用戶端版本:公開

  • 作業系統:不公開

官方網站https://pidgin.im/


常見用戶端的總結#

用戶端 Gajim Dino Psi+ Pidgin Conversations
(系列)
OS 支援
Windows Yes No Yes Yes No
macOS Yes No Yes Yes No
Linux Yes Yes Yes Yes No
BSD FreeBSD FreeBSD
OpenBSD
FreeBSD (Psi) FreeBSD No
Android No No No No Yes
端對端加密
OMEMO Yes Yes Yes (不支援群聊) Yes (?) Yes
PGP (XEP-0027) Yes (+XEP-0373) Yes Yes Yes Yes
OTR No No Yes Yes Yes (monocles)
隱私度
(設定後)
時區 可不公開 不公開 可不公開 公開 公開
OS 可不公開 不公開 可不公開 不公開 公開
用戶端版本 公開(只對聯絡人) 不公開 可不公開 公開 公開

結語#

以上就是有關使用 XMPP 的注意事項。如果有任何問題希望本人補充,歡迎 聯絡本人。