利用 Slack 影片嵌入實現端對端加密
Slack 影片區塊作為客戶端執行的向量
Slack 在影片區塊中的 video_url 欄位因缺乏執行時內容驗證,允許執行任意客戶端程式碼。雖然此欄位原本是用於影片嵌入,但平台只會檢查提供的 URL 是否可存取且回傳 2xx 或 3xx 的 HTTP 回應碼。驗證通過後,內容會以簡單的 iframe 方式呈現,使開發者能直接在 Slack 介面內載入自訂的 Web 應用程式。
在 Slack 中實作端對端加密 (E2EE)
透過影片區塊的 iframe 功能,可以建立一套系統,讓加密金鑰僅在客戶端處理,確保伺服器永遠不會看到已解密的私鑰。實作使用瀏覽器的 Subtle Crypto API 與 openpgpjs 函式庫(由 Proton 維護)來處理複雜的加密運算。
E2EE 工作流程
傳送加密訊息的流程如下:
- 啟動:使用者執行
/e2ee send指令,會開啟 Slack 模態視窗讓使用者選擇收件者。 - Slug 產生:伺服器產生一個唯一的 slug,內含作者已加密的私鑰與收件者的公鑰,並將其儲存於 KV 資料庫。
- 客戶端載入:使用者與影片區塊互動時,本機客戶端會載入與該 slug 相關的資料。
- 本機解密:作者在本機使用密碼解密自己的私鑰。
- 本機加密:作者撰寫訊息,為收件者加密並使用自己的金鑰簽名——全部在 iframe 內本機完成。
- 傳輸:僅將加密後的密文回傳給伺服器。
- 投遞:伺服器將包含加密訊息的「信封」送達收件者。
技術限制與實作細節
- TypeScript:此專案使用 TypeScript 開發,以加速迭代。
- 暫時訊息限制:影片區塊無法放入暫時訊息(ephemeral messages),此行為在 Slack 官方 Block Kit 文件中未被記載。
- 資料儲存:為了減少伺服器端的資料保留,系統採用基於 slug 的機制,將必要的加密資料傳遞給客戶端 iframe。
- Node.js 整合:專案利用現代 Node.js 版本提供的原生
.env檔案支援來設定環境變數。
專案可取得性與合規性
此實作的原始碼可在 github.com/v1ctorio/e2ee-slack 取得。作者指出此方法是一種「hack」,因為它未完全符合 Slack 對影片區塊的設計限制。它作為概念驗證,顯示需要更彈性、功能完整的應用程式整合,類似 Discord 的「Activities」或 Telegram 的「Mini Apps」。
摘要: 開發者 victorio 透過利用影片區塊 iframe 缺乏執行時檢查的特性,在 Slack 中實作端對端加密 (E2EE),以在客戶端執行加密運算。
標題: 利用 Slack 影片嵌入實現端對端加密