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

15 投票
5 回答
6115 浏览
提问于 2025-04-16 09:25

我正在开发一个开源的Python推特客户端,为了能够访问推特的API并使用OAuth登录,我在推特上注册了我的客户端,他们给了我一个独特的消费者密钥和消费者令牌(以后称为“开发者密钥”)。这些密钥是专门为我的客户端生成的,所有的客户端副本都必须使用同一个开发者密钥。

现在,我需要在一个Python脚本(main.py)中使用这个开发者密钥,但因为这是一个脚本,所以没有可执行文件。此外,我还需要把我的代码上传到GitHub,因为我在GitHub上使用git来跟踪内容。

我该如何保护我的开发者密钥不被泄露呢?请注意,我计划将这个客户端分发给用户。

使用密钥环似乎是个不错的选择,但我希望只有应用程序能访问这个密钥环,连用户(在应用程序外部)都不能访问。而且,没有人能通过查看我的代码来弄清楚如何访问这个密钥环。

注意:“要使用推特的API,首先你需要注册一个客户端应用程序。每个你注册的客户端应用程序都会获得一个消费者密钥和秘密。这种密钥和秘密的机制类似于ssh等协议中使用的公钥和私钥,熟悉这些的人应该能理解。这些密钥和秘密将与您选择的编程语言中的OAuth库一起使用,以对您向API发出的每个请求进行签名。通过这个签名过程,我们可以信任自我标识的流量确实是您。” - http://dev.twitter.com/pages/auth

5 个回答

3

密钥必须放在源代码之外,通过命令行或配置文件传递给程序。如果你把密钥直接写在源代码里,就没办法隐藏它(比如调试工具会显示出来)。

更重要的是,为了避免冲突或者让用户知道这个密钥,不应该让不同的用户共享同一个密钥。通常的做法是建立一个网络服务,这个服务知道密钥,并且与最终的服务器(比如Twitter)进行沟通。客户端软件会使用每个用户专属的密钥与这个服务进行交流。

8

你可以使用 OAuth.io 来实现这个功能。

这个概念很简单:

  • 你只需要把你的API密钥放到OAuth.io的密钥管理器里
  • 在你的源代码中,使用OAuth.io的公钥

这样你的秘密密钥就不会泄露了。

可以查看这篇博客,了解如何使用Twitter API和OAuth.io: 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
        })
    })
})
4

在Apalala的回答基础上,我认为这里说的是一种“代理”网络服务。人们会把他们的请求发给你,你代表他们签名,然后把请求发送到Twitter,当然前提是他们允许你的应用程序访问。

你不用担心有人会给你发垃圾信息,因为他们使用这个服务时必须先登录Twitter。

唯一的问题,就像其他地方一样,就是我怎么能信任你的应用程序,愿意一开始就让它访问我的信息呢? :)

撰写回答