如何避免将身份验证数据置于版本控制中?

时间:2015-08-27 13:10:43

标签: java git ebay-api

这个问题只是非正式的,因此我无法提供任何类型的MWE / example /...

我想开发一个与eBay API交互的Java应用程序。 为此,必须从中获取(私有)密钥以进行身份​​验证,以避免单个应用程序干扰正常进程。很明显,将这些密钥放在Git存储库中并发布repo是一个坏主意。

另一方面,我想允许其他人为自己的工作贡献和/或使用我的代码(经典的开源方法)。

我可以想到以下方法来解决这个问题:

  1. 将主代码写为LGPL库,并使用库和密钥编写一个小应用程序。因此,可以毫无问题地发布库。
  2. 创建一个包含密钥的单独类;不要把它放到存储库中。
  3. 在VCS之外添加一个文本文件(或被其忽略)到项目中,并在运行时从.jar文件中读取它。
  4. 在编译时做一些奇特的事情:在真正的编译器将正确的数据运行到源文件之前以某种方式替换然后删除。这是将编译器包装在shell脚本中或为关键文件配置用户定义的编译例程。
  5. 前两种方法的好处是从完成的jar文件中重新获得密钥很复杂(我想,如果它很容易反向可操作,请纠正我)。缺点是任何其他人都无法编译该程序。在案例1中,缺少主要方法;在案例2中,将引用整个类但不存在。

    案例3是一个坏主意,因为如果你有jar文件,你可以直接将密钥提取为文本文件并以纯文本形式提供。

    在我看来,案例4也不是最好的解决方案:在编译时搞乱源代码对我来说非常讨厌。然而,这是(据我所知)这里提出的最佳解决方案。

    您能想到更好的解决方案吗? 如何正确处理这些问题?

    修改
    为了使事情更清楚: 我并不担心使用我的应用程序的用户的凭据。 相反,eBay要求使用其API的每个程序使用密钥对自身进行身份验证。 这样,如果运行僵尸或做非法事情(根据许可协议),eBay可以关闭单应用程序。

    这些密钥(API的访问密钥)需要由应用程序读取(否则我无法通过它们进行身份验证),但这些密钥不能供其他任何人使用。 如果有人拥有密钥,他/她可以用我的程序名称发送API调用,并导致我的密钥被撤销。

2 个答案:

答案 0 :(得分:1)

将身份验证凭据存储为生产实例上的环境变量。

答案 1 :(得分:0)

不要给它们

有一个类似的question here on security stack exchange建议通过您自己的网络服务代理API调用。因此,不是将密钥分发给客户端,而是将其安全地保存在服务器上,并要求客户端进行身份验证。

只要您将API密钥提供给客户端,无论是将其编译到您的应用程序中还是在运行时下载,他们都能够检索它。如果用户很聪明并且有决心,我就不会对保守秘密的密钥抱有太多信心。即使你像documentation推荐的那样加密它,在某个时间点它也必须是未加密的并在HTTP请求中发送给eBay。

就存储密钥的位置而言,如果您使用自己的服务,请将密钥保存在所有配置管理内容中并保持加密状态。您可以拥有一个单独的私有git仓库,其中包含您的服务ansible配置。将密钥保存在加密的ansible Vault文件中。

为每个用户提供不同的密钥

eBay API不支持此功能,但如果您能够为每个用户使用不同的密钥,那么至少如果密钥被滥用,您应该知道应该责备谁。

API确实具有用户令牌的概念,让您的应用程序代表用户行事。但是,要在每个请求中使用you still have to pass in your app key。所以你仍然留下了保存开发密钥的问题......