如何在托管在 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 列表?