本文將額外補充一些有關 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-0027,XEP-0373。前者已被 XSF 視為廢除,可是大部分用戶端都不支援後者。
XEP-0373 相比 XEP-0027,除了進行加密外還會進行簽名。這樣你可以知道訊息是否真的是密鑰持有人發送。參見:XMPP E2E Security
用法#
使用時自己必須要有 PGP 公鑰和私鑰。然後導入對方的 PGP 公鑰。對方的公鑰通常可以在對方網站,金鑰伺服器(Key Server)等地方找到(視乎對方發佈公鑰的方式,例如本人的話是放在聯絡頁面中)。
密鑰對(公鑰和私鑰)的生成和導入,不同的用戶端有不同做法。有些用戶端可以自動生成和導入公鑰,有些則要手動。
支援度#
XEP-0027 的話很多用戶端都已經支援,但 XEP-0373 目前支持的還是很少,似乎只有 Gajim。
OTR#
不支援離線通信,某程度上也被 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。
致命缺點是,如果嘗試用 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」插件間接地分辨出來)。
Pidgin#
Pidgin 的特點是多協議支援(可以不只用 XMPP)。但我認為 Pidgin 隱私度不太好,尤其與其他桌面用戶端相比。
OMEMO 支援也似乎不全(?)。如果對端對端加密有需求,不推薦。
支援平台:Windows、macOS、Linux、FreeBSD
加密支援(未親自測試)
- OMEMO
- 似乎要手動安裝:https://github.com/gkdr/lurch/
- 似乎支援好像不全?(https://omemo.top/)
- OpenPGP (XEP-0027?)
- OTR
隱私度:一般
-
時區、用戶端版本:公開
-
作業系統:不公開
官方網站: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 的注意事項。如果有任何問題希望本人補充,歡迎 聯絡本人。