Show HN: 利用Slack的视频嵌入实现E2EE通信

Hacker News Top 工具

摘要

本文介绍了一个概念验证工具,该工具利用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)。如果更多主流服务采用这种方式,岂不是很有趣?

相似文章

加密空间

Lobsters Hottest

加密空间是一种协作应用架构的研究预览,确保数据经过加密且操作可进行密码学验证,允许服务器存储数据而无法查看明文。它包含一个原型同步引擎,由微软研究院和哈佛大学伯克曼克莱因中心共同开发。

Show HN: E2a – 面向 AI 智能体的开源邮件网关

Hacker News Top

E2a 是一款开源邮件网关,支持 AI 智能体通过 webhook、WebSocket 或 HTTP API 安全地收发邮件。它具备 SPF/DKIM 验证功能,提供 TypeScript 和 Python SDK,并支持可选的人工介入审批。

Openclaw OS

Product Hunt

Openclaw OS 是一款工具,能将一次性对话转变为持久可用的应用。