保护 Twitter 帐户的 API 密钥,以便在其他 PC 上运行程序

信息安全 api Python 钥匙
2021-09-01 07:05:05

我创建了一种方法来允许我的项目EditVideoBot被“分散”,而不是程序在我自己的中央服务器上处理和上传所有视频编辑请求,用户可以自愿在他们的计算机上运行这个程序并获取一些卸载我的服务器。

我希望能够开始分发该程序,但我有一个主要问题:

为了让程序将最终编辑的视频上传到 Twitter,它需要我的 Twitter API 密钥。显然,我需要一种加密密钥的方法,这样运行程序的用户就无法访问它们(否则他们可以完全访问我的帐户)。

该机器人是用 Python 编写的。如果程序在另一台计算机上运行,​​我真的不知道从哪里开始保护密钥的安全。

编辑:如果 Twitter API 有一种方法可以生成具有受限权限的密钥(例如,它们只能访问媒体上传端点,但不能访问任何其他端点),那将是最好的方法。(就像 Cloudflare 的 API 一样)。然后,他们会将返回的媒体 ID 转发到我的服务器,在那里它具有完全访问权限,并发布附有媒体 ID 的推文。我不认为他们有这种能力,所以需要另一种方法。

3个回答

正如指定的,这个问题是完全不可能的。你不能也不应该试图让程序——更不用说脚本——做用户看不到的事情。攻击者可以通过多种方式破解这一点。他们可以只阅读和分析您的 python 脚本(即使已编译,.pyc 也很容易反编译)。他们可以在程序运行时对其进行调试。他们可以拦截它向 Twitter 发出的网络请求,并从中提取密钥。他们可以将 Python HTTPS 库替换为包含官方 API 的库,并将请求和响应的副本记录为纯文本。他们可以将您的程序作为另一个 python 程序的库加载,并以编程方式检查其内容……说真的,人们一直在问这个问题,但这是做不到的。

正如@Limit 的评论所说,你最好的办法是从你的服务器公开一个API,并让你的脚本用它想放在Twitter 上的任何东西来调用它。然后,您可以在发布消息之前对其进行验证,限制每个客户的上传速度,防止滥用帐户(例如删除推文或使用 DM),并仅通过禁用服务器上的端点来完全撤销第三方对帐户的访问权限。这还不足以完全防止滥用,但它比任何试图在 Python 脚本中隐藏秘密的方法都要好得多。

另一种选择是为每个用户使用唯一的 Twitter 帐户。要么要求用户创建/提供他们自己的帐户(然后您的服务器会了解并监控上传,可能带有特定的标签或提及),或者自动创建一个(好吧,就像 Twitter 让你侥幸逃脱一样自动)每个节点,不要将它们用于其他任何事情(运行节点的用户在每种情况下仍然可以完全访问该帐户,但不能访问任何其他帐户)。

或者您可以让节点将生成的视频发送到您的服务器,然后您的服务器决定如何处理它们。这与第一个可行的方法基本相同,除了新端点不是“在此处发送视频以上传到 Twitter”,它只是“完成后在此处发送视频”,并且您-服务器所有者决定如何处理它然后。

显然,我需要一种方法来加密它们的密钥,这样运行程序的用户就无法访问它们

显然,这是不可能的

密钥只是数据。软件只是数据。一切都只是数据,如果数据在别人的电脑里,你不能阻止他们访问数据!(这就像在一张纸上写一些东西然后交给其他人——你不能阻止他们阅读它!唯一的例外是如果你加密数据并且不让他们访问解密密钥——但这会在这里帮不了你。)

上面的讨论意味着您需要信任拥有密钥的用户。您无法避免此信任问题,但您可以将其转移到不同的目标。某些硬件,例如支持Software Guard Extensions的 Intel CPU ,允许其所有者有效地将硬件控制权交还给制造商,至少就所谓的“飞地”而言。如果 …

  1. 您可以说服用户在受支持的 enclave 中运行您的代码;
  2. 您相信制造商会保守他们的私钥秘密(这是一个非常大的“如果”,特别是如果在每个硬件副本中都使用相同的密钥);
  3. 您使用相应的公钥来验证用户是否确实在使用飞地;
  4. 您相信制造商或您的代码可以避免侧通道攻击(这也是一个非常大的“如果”,因为最近的 CPU——包括一些设计时考虑到侧通道攻击的——已经有许多已知的攻击);
  5. 您相信制造商会使飞地免受任何其他基于软件或硬件的攻击(这也是一个非常大的“如果”,因为用户可以物理控制硬件)

……然后您将信任问题从用户转移到制造商尽管有所有这些警告,但有些人似乎认为飞地很有用。从技术上讲,这是对所提出问题的回答。但是它存在很多问题,以至于它似乎不是一个真正的答案。

无论如何,您创建一个可以发布到您帐户的分布式机器人的总体目标听起来像是一场等待发生的灾难。如果您不相信志愿者不会访问您的 API 密钥,那么您如何相信他们不会返回您不想关联的视频类型?一个答案是使用飞地,上面讨论了所有注意事项。

用户可以自愿在他们的计算机上运行这个程序并减轻我的服务器的一些负载

可能有一种更简单的方法可以实现这一点,EditVideoBot FAQ 中暗示了这一点

我在哪里可以找到机器人的源代码?

你不能,至少现在还不能。我没有把它开源的主要原因是我不知道我将来想把这个项目带到哪里。不过,我预测我最终会将它开源。

去做就对了。它有利于在多台计算机之间分散计算负载。它有利于在许多开发人员之间分散开发工作。与该站点最相关,对安全性有好处

Oauth2是为委派访问而设计的。Twitter 拥有广泛的支持和良好的文档。切勿直接共享您的 API 密钥!

https://developer.twitter.com/en/docs/authentication/overview

如果您不熟悉 Oauth2,这个 15 分钟的视频可能会有所帮助

https://youtu.be/t18YB3xDfXI