我创建了一个 Python 模块,我想通过 PyPI 分发它。它依赖于第三方 API,而后者又需要免费的 API 密钥。
即使是免费的api-key,您也不应该将它包含在您的代码中,更不用说将您的代码与它一起分发给公众。
我的建议是永远不要在您的代码中包含任何秘密,甚至不要像许多开发人员喜欢在调用中从环境变量、配置文件、数据库或他们从中检索值的任何内容中获取值的默认秘密。
在处理秘密时,您必须始终在未能获得秘密时引发异常...再一次不要使用代码中的默认值,即使借口它们只会在开发期间使用和/或测试。
我建议您阅读 this article 我写的关于在您的代码中泄露秘密的文章,以了解这样做的后果,例如:
例如,黑客可以使用暴露的云凭证来启动服务器以进行比特币挖掘、发起 DDOS 攻击等,而您最终将成为支付账单的人,就像著名的“我的 2375 美元 Amazon EC2 错误”一样...
虽然本文的背景是泄露移动应用程序代码中的秘密,但本文必须适用于我们编写并提交到存储库的任何类型的代码。
关于您提出的解决方案
- 要求用户将 API 密钥保存为环境变量,并让脚本检查该变量是否存在
-
在创建对象的新实例时,要求用户将 API 密钥作为 **kwargs 参数传递,例如
thing = CreateThing(user_key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa', api_key = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbb')
数字 1 是一个不错的选择,您应该在这里使用 dot env 文件方法,也许使用像 this one 这样的包。但是如果值不存在,请记住引发异常,请不要使用代码中的默认值。
关于解决方案 2,对于使用您的库的开发人员来说更加明确,但您也应该向他们推荐 .env 文件并帮助他们了解如何正确管理它们。例如,.env 文件上使用的机密应该从保险库软件中检索。
安全提醒
点 env 文件在任何时候都不能提交到源代码中,并且在将 .env.example 提交到你的 git 仓库时,它不能包含任何默认值。
哦,你可能会想,如果我不小心将它提交到 Github,我只会清理我的提交,重写历史并进行强制推送。好吧,三思而后行,看看为什么这不能解决您创建的问题:
我有个坏消息要告诉你...似乎有些服务会缓存所有 github 提交,因此黑客可以检查这些服务或使用相同的技术在几秒钟内立即扫描任何发送到 github 的提交。
来源:我在上面链接的博客文章。
请记住我之前引用的内容“我的 2375 美元 Amazon EC2 错误,这是由于在 Github 意外提交中泄露了凭据。