利用 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 开发,以实现快速迭代。
- 临时消息限制:视频块无法包含在临时消息中,这一点在 Slack 官方 Block Kit 文档中未有说明。
- 数据存储:为尽量减少服务器端数据保留,系统采用基于 slug 的方式将必要的加密数据传递给客户端 iframe。
- Node.js 集成:项目利用现代 Node.js 版本对
.env文件的原生支持进行环境配置。
项目可用性与合规性
该实现的源代码托管在 github.com/v1ctorio/e2ee-slack。作者指出,这种做法是一种 “hack”,因为它并未严格遵守 Slack 对视频块的设计约束。它作为概念验证,展示了对更灵活、功能完整的应用集成(类似 Discord 的 “Activities” 或 Telegram 的 “Mini Apps”)的需求。