我应该在哪里存储我的 java 应用程序访问第三方服务的凭据?

Where should I store credentials for my java application to access third party services?

我应该在哪里存储我的 java 应用程序访问第三方服务的凭据?

我的应用程序中的凭据不是每个用户特定的。它们用于访问我的应用程序正在使用的 Web 服务。我知道不要将它们硬编码到我的应用程序中,但我应该在哪里以及如何存储它们?我还假设它们需要加密。

  • Db
  • .属性文件
  • 配置 class 常量

Spring 具有很好的 @Value 注释功能,可以使用给定的键从 .properties 文件(在 resources 文件夹下)自动注入值。

我使用它是因为在我的例子中,我在多个应用程序实例中有不同的键值,而 db 将需要更多的复杂性,而且我不会对 db 进行不必要的查询。

在安全基础上,如果攻击者可以读取您服务器上的文件,那么他就可以轻松读取您的数据库,因此不要在这里发挥作用。它可以存储在系统上的任何文件中。

另一方面,您可以使用

配置 class

public static final String SECRET_KEY = "someKey"

.jar 文件是存储所有凭据的最佳方式。

  1. 创建界面,将您的凭据存储为最终字符串
  2. 将接口转换为 jar 文件
  3. 将该 jar 文件添加到您的构建路径中
  4. 在您使用凭据的地方实现此接口,并访问您存储凭据的字符串对象。

以@Zildyan 的回答、评论和对其他答案的引用为基础。

有几个选项可以存储:

  • 数据库
  • 属性文件
  • 常量(硬编码)
  • 文件系统(远离应用程序)

至于如何存储:

取决于灵敏度。凭据可以以纯文本形式存储(低敏感度)或应该加密(高敏感度)。


还应注意,结合使用加密和将凭据与源分开会限制对凭据的内部访问。

一些例子

  • 可以将以纯文本形式存储的密码添加到源代码管理中,任何有权访问源代码管理的人都可以阅读。
  • 任何能够运行密码的人都可以轻松获得带有解密代码的加密密码。
  • 任何有权访问服务器的人都可以访问存储在服务器上的纯文本文件。
  • 存储在文件系统上的加密文件可能只有系统管理员可以访问,并且解密方法可供开发人员使用。

存储在数据库中以及谁有权访问该数据库也是如此。

JNDI

Per Wikipedia:

The Java Naming and Directory Interface (JNDI) is a Java API for a directory service that allows Java software clients to discover and look up data and resources (in the form of Java objects) via a name.

您的企业可能已经建立了与 JNDI 兼容的目录服务。您会要求系统管理员为您的特定凭据包含一个条目。

如果您是自我管理的,那么您的 Java EE(现在 Jakarta EE) 应该有一个内置的 JNDI 兼容服务器。学习配置它,并为您的特定添加条目凭据。