如何在托管在 GitHub 上的 Python 脚本中保密开发人员密钥

Posted

技术标签:

【中文标题】如何在托管在 GitHub 上的 Python 脚本中保密开发人员密钥【英文标题】:How to keep a developer key secret in a Python script that is hosted on GitHub 【发布时间】:2011-06-03 19:23:03 【问题描述】:

我正在开发一个开源的 Python 驱动的 Twitter 客户端,为了访问 Twitter API 和使用 OAuth 登录,我已经在 Twitter 上注册了我的客户端,他们给了我一个唯一的消费者密钥和消费者令牌(以下简称作为“开发人员密钥”)。这些对我的客户来说是唯一的,我的客户的所有副本都必须使用相同的开发人员密钥。 现在,我必须在 Python 脚本 (main.py) 中使用开发人员密钥,因为它是一个脚本,所以没有二进制文件。另外,我必须将代码上传到 GitHub,因为我在 GitHub 上使用 git 进行内容跟踪。 如何保密我的开发者密钥?请记住,我计划将相同的客户端分发给用户。

密钥环似乎是最好的选择,但我想要一种只有应用程序才能访问密钥环的方法,甚至不能访问其用户(应用程序之外)。而且应该没有人能够通过查看我的代码来弄清楚如何访问密钥环。

注意:“要使用 Twitter API,您要做的第一件事是注册一个客户端应用程序。您注册的每个客户端应用程序都将提供一个消费者密钥和秘密。这个密钥和秘密方案类似于公共和熟悉的人在 ssh 等协议中使用的私钥。此密钥和秘密将与您选择的编程语言中的 OAuth 库一起使用,以对您向 API 发出的每个请求进行签名。正是通过此签名我们相信识别自己是您的流量实际上就是您的过程。” - http://dev.twitter.com/pages/auth

【问题讨论】:

我认为这是不可能的。鉴于任何提议的机制,为什么我不能复制实现它的代码并在应用程序外部运行它? 您应该使用 xauth 从用户名和密码中获取 oauth 密钥,然后使用该 oauth 密钥来执行请求 开发人员需要向 Twitter 解释他/她想要 xAuth 的原因,然后才能获得使用 xAuth 的许可。 【参考方案1】:

您可以为此目的使用OAuth.io。

概念很简单:

您只需将 API 密钥放入 OAuth.io 的密钥管理器中 在您的源代码中,使用 OAuth.io 的公钥

您的密钥不会以这种方式泄露。

使用带有 OAuth.io 的 Twitter API 查看这篇博文:http://blog.oauth.io/api-call-using-twitter-api/

完整的示例代码(在 javascript 中)在 JSFiddle 上:http://jsfiddle.net/thyb/kZExJ/5

$('button').click(function() 
    OAuth.initialize('oEcDIQahkO4TUAND-yTs-H6oY_M') //OAuth.io public key
    OAuth.popup('twitter', function(err, res) 
        // res contains tokens (res.oauth_token and res.oauth_token_secret)
        res.get('/1.1/statuses/home_timeline.json').done(function(data) 
            // do what you want with data
        )
    )
)

【讨论】:

【参考方案2】:

密钥必须在源代码之外,并通过命令行或配置文件传递给程序。如果将密钥嵌入到源代码中,则无法隐藏密钥(调试器 f.i. 会显示它)。

更重要的是,为了避免冲突或用户知道密钥,不应该让不同的用户共享同一个密钥。通常所做的是建立一个知道密钥并与最终服务器 (Twitter) 对话的 Web 服务。客户端软件将使用每个用户的密钥与服务进行通信。

【讨论】:

我认为网络服务是最好的选择,但有人可以通过欺骗它来获取密钥,对吧?我所说的密钥是“消费者密钥”和“消费者秘密”,它们在我的客户端的所有实例中都是相同的。 他们如何欺骗您硬件上的网络服务? Python 客户端 -> 您的 Web 服务(使用您希望用户与您一起使用的任何身份验证)-> twitter api(使用您的消费者密钥和秘密)。用户所能做的就是点击您的网络服务,这需要某种形式的身份验证(例如您分发给每个用户的密钥)。【参考方案3】:

扩展 Apalala 的回答,我相信这意味着“代理”网络服务。 人们向您发送他们的请求,您代表他们签名并将其发送到 Twitter,当然,一旦他们允许您的应用程序访问。

您不必担心有人向您发送垃圾邮件,因为他们无论如何都必须登录 twitter 才能使用它。

与其他任何地方一样,唯一的问题是我如何足够信任您的应用程序以首先允许它:)

【讨论】:

【参考方案4】:

我不会随代码分发任何密钥;如果人们想使用它,他们只需要申请自己的密钥。任何其他方法都可能被滥用。

【讨论】:

我所说的密钥是“消费者密钥”和“消费者秘密”,它们在我的客户端的所有实例中都是相同的。【参考方案5】:

创建一个配置文件,您将在其中保存密钥。 不要将原始配置文件发布到 git-hub 中。

您可以使用 Python 配置模块(矫枉过正)或 YAML(我的选择)或普通文件。

如果您希望人们只是启动和运行,您可以创建一个仅在系统中第一次运行的提示,并通过获取用户输入生成配置文件。

【讨论】:

我没有在 GitHub 上发布任何内容。 :) 目前,消费者秘密和消费者密钥驻留在 .gitignore 中。但是当人们开始使用时,他们将需要相同的消费者密钥和消费者密钥,因为它们可以识别客户端的所有实例。

以上是关于如何在托管在 GitHub 上的 Python 脚本中保密开发人员密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何将托管在 GitHub 上的 JavaScript 数组解析为 Python 列表?

如何将域指向托管在 github 页面上的站点?

如何将本地文件上传到github托管

链接并执行托管在 GitHub 上的外部 JavaScript 文件

Android底表上的静态页脚视图

从托管在 GitHub 上的 Spring Cloud Config Server 访问的 repo 的身份验证问题