开发者生态
evening
Show HN:利用Slack的视频嵌入实现E2EE通信
2026-06-15
1 阅读
victorio
西班牙语版本; gh:v1ctorio/e2ee-slack 简介 前段时间,在探索 Slack 的 Block Kit 参考时,我注意到一些奇特的东西:视频块。当我看到它接受 video_url 时,我想到的第一件事是:它如何区分任何内容和实际视频?嵌入是否有任何特殊要求或限制?国外来源?是的,不。除了检查提供的 video_url 是否可访问并以 2xx 或 3xx 代码响应之外,没有运行时检查。经过这些检查后,它只不过是一个简单的 iframe。所以,几天前我有了一个想法。如果有一个应用程序允许您使用密钥对加密消息并通过 Slack 发送消息会怎么样?这个想法很简单。在客户端内部,使用浏览器加密 API 创建密钥对,加密私钥并将其发送到服务器。然后,每当您想要执行操作(签名、加密、解密)时,服务器都会向您发送回您的密钥,并且在视频块内,您将解密您的密钥并执行操作。这样,服务器永远不会获得解密的密钥,但通过密钥对,您可以为任何人加密消息。 e2ee Slack 实施的注册流程展示 单击可跳过实施。对于这个应用程序的开发,我选择了 TypeScript。没有其他原因,只是因为我已经习惯了它并且我能够用它快速迭代。在 Slack 应用程序的实现过程中,我花了相当多的时间才意识到视频块不能包含在临时消息中。此行为没有在任何地方记录。关于加密,首先,我尝试自己编写所有加密逻辑。使用浏览器中微妙的加密 API(在 Slack 视频块中完全可用)。很快我就注意到这有多么困难。我需要了解多少技术和案例。幸运的是,在遭受更多痛苦之前,我找到了 openpgpjs 。由 Proton(是的,电子邮件人员)维护的一个令人惊叹的库,可以完成我需要的所有加密操作。我希望服务器通过将大部分数据存储在松弛元数据字段中来保存尽可能少的数据。我已经在诚实印象(一个匿名的无状态松弛机器人)中做到了这一点。所有 slack 消息或视图都可能存储从未在客户端中显示的元数据字段。由于加密消息的长度,我无法使用此功能。为了服务 iframe,我最终使用了 slug 系统。在每次需要客户端交互的调用中,一个唯一的 slug 存储在 KV 数据库中,其中包含要完成的操作所需的数据。加载视频嵌入后,此信息将嵌入客户端代码中,因此所有加密操作都可以在本地完成。例如,加密消息的流程很简单:首先,执行 Slack 命令 /e2ee send。 Slack 模式打开,请求消息的收件人。提交该模式后,会生成一个 slug,其中包含:作者私钥和收件人公钥。当单击 Slack 内的视频块时,本地客户端会加载上述信息。作者通过他的密码(本地)解密他们的私钥。作者编写消息,为收件人加密消息,并使用他的密钥(本地)对其进行签名。作者仅发送加密消息。服务器将信封发送给消息的每个收件人。顺便说一句,在开发这个项目时,我发现了现代 Nodejs 所提供的一些奇迹。您知道 Node 现在原生支持 .env 文件吗?我没有!结果 您现在可以查看该项目,源代码位于 gh:v1ctorio/e2ee-slack 。并在大约 5 分钟内为您的 Slack 工作空间自行托管它。这个项目最终成为了一个黑客项目,因为它不完全符合 Slack 的设计约束。但这让我一直想知道。网络技术赋予我们所有的灵活性。如果主要服务在其客户端内支持功能齐全的应用程序,那不是很好吗?我的意思是,Discord 已经通过“活动”或 Telegram 与“迷你应用程序”做了类似的事情。看到更多主流服务采用这种方法不是很有趣吗?