利用 Slack 影片嵌入實現端對端加密

Slack 影片區塊作為客戶端執行的向量

Slack 在影片區塊中的 video_url 欄位因缺乏執行時內容驗證,允許執行任意客戶端程式碼。雖然此欄位原本是用於影片嵌入,但平台只會檢查提供的 URL 是否可存取且回傳 2xx 或 3xx 的 HTTP 回應碼。驗證通過後,內容會以簡單的 iframe 方式呈現,使開發者能直接在 Slack 介面內載入自訂的 Web 應用程式。

在 Slack 中實作端對端加密 (E2EE)

透過影片區塊的 iframe 功能,可以建立一套系統,讓加密金鑰僅在客戶端處理,確保伺服器永遠不會看到已解密的私鑰。實作使用瀏覽器的 Subtle Crypto API 與 openpgpjs 函式庫(由 Proton 維護)來處理複雜的加密運算。

E2EE 工作流程

傳送加密訊息的流程如下:

  1. 啟動:使用者執行 /e2ee send 指令,會開啟 Slack 模態視窗讓使用者選擇收件者。
  2. Slug 產生:伺服器產生一個唯一的 slug,內含作者已加密的私鑰與收件者的公鑰,並將其儲存於 KV 資料庫。
  3. 客戶端載入:使用者與影片區塊互動時,本機客戶端會載入與該 slug 相關的資料。
  4. 本機解密:作者在本機使用密碼解密自己的私鑰。
  5. 本機加密:作者撰寫訊息,為收件者加密並使用自己的金鑰簽名——全部在 iframe 內本機完成。
  6. 傳輸:僅將加密後的密文回傳給伺服器。
  7. 投遞:伺服器將包含加密訊息的「信封」送達收件者。

技術限制與實作細節

  • 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 影片嵌入實現端對端加密

Sources