Show HN: 利用Slack的视频嵌入实现E2EE通信
摘要
本文介绍了一个概念验证工具,该工具利用Slack的视频嵌入功能,通过浏览器加密和openpgpjs在Slack内部实现端到端加密的消息传递。
暂无内容
查看缓存全文
缓存时间: 2026/06/15 18:00
# 利用 Slack 的视频嵌入实现端到端加密通信
来源:https://v1c.rocks/log/exploiting-slack-video/
西班牙语版本见此处(https://v1c.rocks/log/cifrado-e2e-slack);gh:v1ctorio/e2ee-slack(https://github.com/v1ctorio/e2ee-slack)
## 引言
不久前,在探索 Slack 的 Block Kit 参考文档时,我注意到一个特别的地方:`video` 块(https://docs.slack.dev/reference/block-kit/blocks/video-block/)。看到它接受 `video_url` 参数时,我首先想到的是:它如何区分任意内容与真正的视频?嵌入内容是否有特殊要求或限制?是否支持外部来源?
嗯,并没有。除了检查提供的 video_url 是否可访问并返回 2xx 或 3xx 状态码外,没有运行时的校验。这些检查之后,它不过是一个简单的 iframe 而已。
于是,几天前我有了一个想法。如果有个应用能让你用密钥对加密消息,然后通过 Slack 发送,会怎样?
思路很简单:在客户端内,使用浏览器的加密 API 生成密钥对,加密私钥并发送到服务端。之后,每次需要执行操作(签名、加密、解密)时,服务端会将你的密钥通过视频块返回,你可以在该视频块内解密密钥并执行操作。
这样,服务端永远无法获取解密后的密钥,而通过密钥对,你可以为任何人加密消息。
e2ee Slack 注册流程展示
e2ee Slack 注册流程展示
## 实现
点击跳过实现部分。(https://v1c.rocks/log/exploiting-slack-video/#result)
在开发这个应用时,我选择了 TypeScript。没什么特别原因,只是我已经习惯了,而且用它迭代很快。
在实现 Slack 应用的过程中,我花了相当一段时间才意识到:视频块不能包含在临时消息中。这个行为在文档里没有任何说明。
关于加密部分,起初我想自己编写所有加密逻辑,使用浏览器中的 subtle crypto API(在 Slack 视频块中完全可用)。很快我就意识到这有多困难——需要了解多少技术和场景。
好在,在我受更多折磨之前,我找到了 openpgpjs(https://openpgpjs.org/)。这是一个由 Proton(没错,就是做邮件的那个团队)维护的优秀库,能完成我需要的所有加密操作。
我希望服务端尽可能少存数据,因此将大部分数据存储在 Slack 的元数据字段中。我之前在 honest-impressions(https://github.com/v1ctorio/honest-impressions)(一个匿名的无状态 Slack 机器人)中已经这样做过。所有 Slack 消息或视图都可以存储一个元数据字段,该字段在客户端中从不显示。不过由于加密消息的长度,我无法使用这个功能。
为了提供 iframe,我最终采用了 slug 机制。每次需要客户端交互的调用,都会生成一个唯一的 slug,其中包含执行操作所需的必要数据,并存入 KV 数据库。当视频嵌入加载时,这些信息会与客户端代码一起嵌入,从而所有加密操作都可以在本地完成。
以加密消息为例,流程很简单:
1. 首先,执行 Slack 命令 `/e2ee send`。会打开一个 Slack 模态窗口,要求输入消息的接收者。
2. 提交该模态窗口后,生成一个 slug,其中包含:作者的私钥和接收者的公钥。
3. 在 Slack 中点击视频块时,本地客户端会加载上述信息。
4. 作者通过自己的密码短语(本地)解密私钥。
5. 作者编写消息,为接收者加密并用其密钥签名(本地)。
6. 作者只发送加密后的消息。
7. 服务端向每个消息接收者发送信封。
顺便说一句,在开发这个项目时,我发现了现代 nodejs 的一些神奇功能。你知道吗,Node 现在原生支持 .env 文件(https://nodejs.org/api/environment_variables.html#dotenv)了?我之前可不知道!
## 结果
你现在就可以查看这个项目,源代码在 gh:v1ctorio/e2ee-slack(https://github.com/v1ctorio/e2ee-slack)。大约 5 分钟就能在你的 Slack 工作区自行部署。
---
这个项目最终算是一个 hack,因为它没有完全遵守 Slack 的设计约束(https://docs.slack.dev/reference/block-kit/blocks/video-block/#constraints)。但这让我一直在思考:考虑到 Web 技术赋予我们的灵活性,如果主流服务能在其客户端内支持功能完整的应用,那该多好?
我是说,Discord 已经通过“活动”(https://docs.discord.com/developers/activities/overview)做了类似的事,Telegram 也有“小程序”(https://core.telegram.org/bots/webapps)。如果更多主流服务采用这种方式,岂不是很有趣?
相似文章
Show HN:开源私有家庭安防摄像头系统(端到端加密)
Secluso 是一款基于树莓派的开源、端到端加密家庭安防摄像头系统,可在无需云监控的情况下实现远程访问。它支持 5 分钟快速部署和可重现构建。
Signal 校友发布“Encrypted Spaces”,一个用于构建私有协作应用的系统
前 Signal 开发者和来自哈佛大学、微软研究院的密码学家发布了 Encrypted Spaces,这是一套开源库,使开发者能够利用零知识证明构建端到端加密的协作应用。
加密空间
加密空间是一种协作应用架构的研究预览,确保数据经过加密且操作可进行密码学验证,允许服务器存储数据而无法查看明文。它包含一个原型同步引擎,由微软研究院和哈佛大学伯克曼克莱因中心共同开发。
Show HN: E2a – 面向 AI 智能体的开源邮件网关
E2a 是一款开源邮件网关,支持 AI 智能体通过 webhook、WebSocket 或 HTTP API 安全地收发邮件。它具备 SPF/DKIM 验证功能,提供 TypeScript 和 Python SDK,并支持可选的人工介入审批。
Openclaw OS
Openclaw OS 是一款工具,能将一次性对话转变为持久可用的应用。