2017年6月14日 星期三

pidgin 與 chatsecure 加密對話實況解說

pidgin 的 otr 外掛 [2018/5/7] 本文作廢。 改推薦 xmpp 加密簡訊自由軟體再出發

本文用一個對話過程來解說 xmpp 的實際操作方式。 強烈建議動手實測之前請先讀一下結論那節! 以下實驗建中, chatsecure 的部分, 議用一個新的、 還沒有累積朋友的帳號來進行, 以免發生意外, 變成沒有朋友的人! 假設讀者跟朋友已 申請 xmpp 帳號並安裝 pidgin and/or chatsecure, 又假設讀者略懂略懂 非對稱式加解密。 安裝 pidgin 的那一方, 也請先安裝 pidgin-otr 套件, 並且在 「工具」=>「模組」 底下勾選啟用 otr (off-the-record) 功能。 可能還需要展開 「模組明細」、 點選 「設定模組」、 點一下 「Generate」 以便產生加密用的金鑰。 下文對話的兩個角色分別是:

簡稱 新貴 老貴
帳號 ckhung@xmpp.zone ckhung@jabber.org
OS CM (android) lubuntu 16.04
app chatsecure pidgin

一、 對話實錄

新貴提出交談請求 老貴的 pidgin 上出現交友邀請通知 老貴接受交友通知之後, 將新貴加入朋友清單 新貴提出交友請求 新貴接受老貴的交友請求

一開始新貴的手機跟老貴的電腦裡都沒有對方的帳號資訊。 新貴得到老貴的 xmpp/jabber 帳號, 於是提出交談請求。 老貴的 pidgin 上便出現了交友邀請通知。 這時老貴可以選擇直接 「送出即時訊息」, 這將會在未交朋友的情況下開始對話。 不過老貴知道新貴是誰, 所以直接選擇了 「給予認證」, 這其實也不是什麼真的認證, 只是向對方發出交友請求, 同時也將新貴加入自己的朋友清單而已。 最後, 新貴的 chatsecure 自動補上交友請求、 也接受老貴的交友請求。

新貴在手機上的 chatsecure 看到的對談 老貴在電腦上的 pidgin 看到的對談

再來這兩張圖分別是新貴在手機上的 chatsecure 看到的對談, 以及老貴在電腦上的 pidgin 看到的對談。 注意到新貴的 chatsecure 上方, 鎖頭是鎖上的, 表示這段對話有加密; 但鎖身上有個問號, 表示不確定對方是誰。 老貴的 pidgin 右下方的 「unverified」 也有相同的意思: 有加密, 但不確定對方是誰。 (下詳)

新貴被老貴刪朋友之後, chatsecure 掛掉重啟 老貴那頭看到的狀況

然後老貴突然決定把新貴從朋友清單當中刪除。 結果造成新貴的 chatsecure 掛掉、 重開。

二、 隱私提醒

實際上 xmpp 的朋友關係是由兩個 「單向追蹤」 的關係組合而成的。 所謂 「交友邀請」, 其實是 「我想追蹤你」 的請求。 接受對方的追蹤請求之後, 你何時上線何時離線, 對方都看得到 -- 好友可以在他的 pidgin 的 「工具」 底下, 啟用 「好友狀態捕捉」 這個輕度變態工具來偷窺你的作息。

只不過軟體 (pidgin 或 chatsecure) 通常會盡量做到對稱, 也就是你提出請求的同時, 也允許對方追蹤你。 但是如果對方不接受, 就有可能變成: 他可以看到你的作息, 你無法看到他的作息。 在 pidgin 的好友清單當中, 好友代號的右方如果出現紅圈禁止標記, 就意謂著對方禁止你追蹤他。 在 chatsecure 裡, 如果好友的代號是灰色而非彩色的, 那就表示他目前離線; 但如果連他在跟你對話時都是灰色的, 那就表示他禁止你追蹤他。 這是不太對稱的單向 (朋友?) 關係啊~~

拒絕朋友追蹤 原先雙方彼此已認證的好友, 後來也可以單方面取消。 在 pidgin 的好友清單裡, 找到一位 「疑似有偷窺傾向的好友」, 按滑鼠右鍵, 叫出右圖選單, 選 「取消發出狀態資訊通知」 即可。 當然, 他也會從他的 pidgin 好友清單上的紅圈禁止標記看到你已不再把你的作息分享給他。

三、 確認代碼真的屬於朋友本人

所謂 「有加密, 但不確定對方是誰」 是什麼意思呢? 所謂加密, 也只是用數學方法確認公鑰持有人之外別無他人能夠讀取訊息而已。 但是這把公鑰真的屬於朋友本人嗎? 還是這根本是 NSA 或 FBI 探員冒充朋友的身份要取得你的信任呢? 為了確保加密對談的對象真的是朋友本人, 你應該在對話視窗的 「OTR」 選 「Authenticate buddy」。 確認的方式有三種:

  1. 如果朋友就在你身邊, 可以選用最簡單的方式: 手動確認公鑰指紋 -- Manual fingerprint verification。 其實連肉眼比對公鑰都可省略: 你看著自己打的訊息馬上出現在他的電腦/手機上, 就知道現在對話的對象確實是他沒錯。 直接選 「I have」 verified ... 並按 「authenticate」, 從此以後你寄給他的訊息就確認安全了。 (如果他的電腦/手機沒被裝側錄軟體的話。)
  2. 在 chatsecure 裡面回應認證請求 在 pidgin 裡面提出認證請求 如果朋友不在身邊, 但是有其他私密安全的溝通管道 (例如 sip 加密電話) 那麼可以採用 Shared secret: 隨便訂一串中英文字串, 用安全私密的方式告訴他, 請他接到認證請求時, 逐字輸入。
  3. 如果朋友在遠方, 而且沒有私密安全的其他聯絡方式, 那就只好用比較費腦筋的 Question and answer 方式來認證。 向他提出一個問題, 答案只有你跟他知道, 格式要定義得很精確。 範例: 「2015年6月12日同學會聚餐時,你左手邊坐誰? 右手邊坐誰? 結束後上車前我跟你談到誰? 請寫三個人的外號,中間不要空格或任何標點符號。」 把你預期的答案填在下面。 朋友回答時, 你的軟體會逐字比對, 驗證兩個字串是否一模一樣。

在 pidgin 裡面認證成功之後的加密對話 在 chatsecure 裡面認證成功之後的加密對話

上圖是認證成功之後的加密對話。 在 pidgin 裡面, 右下角會看到一個綠色的 「private」; 在 chatsecure 裡面, 右上角的鎖頭裡面會出現一個綠色的勾。

在 chatsecure 底下, 按鎖頭符號可以選擇要用什麼方式提出認證。 QR code 目前好像還不能用。

如果雙方已彼此認證, 但想要重來一次, 可能需要先把對方的認證都取消掉。 在 chatsecure 底下, 點鎖頭、 選 「view profile」、 「question」, 重新問一個問題, 請對方故意答錯。 在 pidgin 底下, 在對話視窗的右下角點 「Not private」=>「start private conversation」, 然後 「OTR」=>「reauthenticate buddy」, 「manual fingerprint verification」, 改選 「I have not」... 就可以取消認證。

四、 結論/其他注意事項

自己跟自己對話兩天之後, 有以下心得:

  1. 同一個帳號, 不要同時在多部機器裡登入, 否則聊天時系統會錯亂, 不知該把訊息傳到哪一部機器。
  2. 在 pidgin 裡面, 可以同時登入幾個不同的帳號; 但是 chatsecure 對於 「多帳號」 的支援還有很多 bugs, 建議只加入一個帳號就好。
  3. 對話到一半時突然關掉 otr
  4. 對話到一半時, 如果突然做了任何奇怪的變動 (關掉 otr、 取消朋友、 另一部機器又要新增一個對話、 ...) 對話視窗可能會變成亂碼 (如右圖), 甚至可能會造成 chatsecure 突然掛掉。 比較保險的方式是: 要做任何變動之前, 先結束所有對話視窗。 (pidgin: 直接關閉視窗; chatsecure: 選右上角的 「end chat」)

總之, chatsecure 的 bug 還蠻多的。 因為我手機打字很慢, 但也只有手機的 chatsecure 會隨時上線, 所以先前好幾次朋友透過 chatsecure 找到我, 而我則企圖改用電腦上的 pidgin (用同一個帳號) 跟他對話, 結果從來沒成功過。 現在分別用兩個帳號, 看看是否能解決這個問題。 不熟的朋友要找我, 請用 ckhung@jabber.org 這個公開的帳號。

也可以參考 xmpp 軟體清單 挑其他你覺得更好用的 app。 比較完整的 app 應該還支援傳檔等等功能。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。