这个问题只是非正式的,因此我无法提供任何类型的MWE / example /...
我想开发一个与eBay API交互的Java应用程序。 为此,必须从中获取(私有)密钥以进行身份验证,以避免单个应用程序干扰正常进程。很明显,将这些密钥放在Git存储库中并发布repo是一个坏主意。
另一方面,我想允许其他人为自己的工作贡献和/或使用我的代码(经典的开源方法)。
我可以想到以下方法来解决这个问题:
前两种方法的好处是从完成的jar文件中重新获得密钥很复杂(我想,如果它很容易反向可操作,请纠正我)。缺点是任何其他人都无法编译该程序。在案例1中,缺少主要方法;在案例2中,将引用整个类但不存在。
案例3是一个坏主意,因为如果你有jar文件,你可以直接将密钥提取为文本文件并以纯文本形式提供。
在我看来,案例4也不是最好的解决方案:在编译时搞乱源代码对我来说非常讨厌。然而,这是(据我所知)这里提出的最佳解决方案。
您能想到更好的解决方案吗? 如何正确处理这些问题?
修改
为了使事情更清楚:
我并不担心使用我的应用程序的用户的凭据。
相反,eBay要求使用其API的每个程序使用密钥对自身进行身份验证。
这样,如果运行僵尸或做非法事情(根据许可协议),eBay可以关闭单应用程序。
这些密钥(API的访问密钥)需要由应用程序读取(否则我无法通过它们进行身份验证),但这些密钥不能供其他任何人使用。 如果有人拥有密钥,他/她可以用我的程序名称发送API调用,并导致我的密钥被撤销。
答案 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。所以你仍然留下了保存开发密钥的问题......