展示 HN: 利用 Slack 的视频嵌入实现端到端加密通信
西班牙语版本在这里 ; gh:v1ctorio/e2ee-slack 介绍 一段时间前,在探索 Slack 的 Block Kit 参考资料时,我注意到一些特殊的东西:视频块。当我看到它接受 video_url 时,我第一个想到的是:它如何区分任何内容和实际视频?嵌入是否会有特定的要求或限制?外部来源?是的,没有。除了检查提供的视频 URL 是否可访问并响应 2xx 或 3xx 代码外,没有运行时检查。在那些检查之后,它不过是一个简单的 iframe。因此,几天前,我想到了一个主意。有没有一种应用程序可以让你使用密钥对加密消息并通过 Slack 发送它们?这个想法很简单。在你的客户端内部,使用浏览器加密 API,你创建一个密钥对,加密私钥并将其发送到服务器。然后,每当你想要进行操作(签名、加密、解密)时,服务器会将你的密钥发回给你,而在视频块内,你将解密你的密钥并进行操作。这样,服务器永远不会获得解密后的密钥,但通过密钥对,你可以为任何人加密消息。 e2ee Slack 实现的注册过程展示 点击跳过实现。为了开发这个应用程序,我选择了 TypeScript。这没有其他原因,只是因为我习惯于它,并且能够快速迭代。在实现 Slack 应用程序的过程中,我花了一段时间才意识到视频块不能包含在临时消息中。这个行为没有在任何地方被记录。关于加密,我最开始试图自己编写所有的加密逻辑。使用浏览器的微妙加密 API(在 Slack 视频块中完全可用)。很快我发现这有多困难。我需要了解多少技术和案例。幸运的是,在遭受更多痛苦之前,我发现了 openpgpjs。一个由 Proton(是的,就是那个邮箱公司)维护的惊人库,做我需要的所有密码学操作。我希望服务器尽可能少地保存数据,通过将大部分数据存储在 Slack 元数据字段中。我已经在 honest-impressions(一个匿名无状态的 Slack 机器人)中做过这一点。所有的 slack 消息或视图都可以存储一个在客户端从未显示的元数据字段。由于加密消息的长度,我无法使用这个功能。为了服务这些 iframe,我最终使用了一个 slug 系统。在每个需要客户端交互的调用中,存储一个唯一的 slug,该 slug 持有执行所需操作的数据。当视频嵌入被加载时,这些信息与客户端代码嵌入在一起,以便所有的密码操作可以在本地完成。作为示例,加密消息的流程很简单:首先,执行 Slack 命令 /e2ee send。一个 Slack 模态打开,要求消息的收件人。在提交该模态后,会生成一个 slug,包含:作者私钥和收件人的公钥。当在 Slack 中点击视频块时,本地客户端会加载上述信息。作者通过他的密码短语(本地)解密他的私钥。作者编写消息,为收件人加密,并用他的密钥(本地)签名。作者仅发送加密消息。服务器将信封发送给每一个消息的收件人。顺便说一下,在开发这个项目的过程中,我发现现代 nodejs 提供的一些惊人功能。你知道 node 现在原生支持 .env 文件吗?我不知道! 结果 你可以立即查看这个项目,源代码在 gh:v1ctorio/e2ee-slack。并且在 ~5 分钟内为你的 Slack 工作区自托管。这个项目最终成为一个黑客,因为它并没有完全遵守 Slack 的设计约束。但这让我思考。考虑到网络技术给我们的灵活性。如果主要服务支持在其客户端内的全功能应用程序,不是很好吗?我的意思是,Discord 已经通过 '活动' 做了类似的事情,Telegram 也通过 '迷你应用'。看到更多主流服务采用这种方式不是很有趣吗?
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡