我应该在哪里存储我的 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 文件是存储所有凭据的最佳方式。
- 创建界面,将您的凭据存储为最终字符串
- 将接口转换为 jar 文件
- 将该 jar 文件添加到您的构建路径中
- 在您使用凭据的地方实现此接口,并访问您存储凭据的字符串对象。
以@Zildyan 的回答、评论和对其他答案的引用为基础。
有几个选项可以存储:
- 数据库
- 属性文件
- 常量(硬编码)
- 文件系统(远离应用程序)
至于如何存储:
取决于灵敏度。凭据可以以纯文本形式存储(低敏感度)或应该加密(高敏感度)。
还应注意,结合使用加密和将凭据与源分开会限制对凭据的内部访问。
一些例子
- 可以将以纯文本形式存储的密码添加到源代码管理中,任何有权访问源代码管理的人都可以阅读。
- 任何能够运行密码的人都可以轻松获得带有解密代码的加密密码。
- 任何有权访问服务器的人都可以访问存储在服务器上的纯文本文件。
- 存储在文件系统上的加密文件可能只有系统管理员可以访问,并且解密方法可供开发人员使用。
存储在数据库中以及谁有权访问该数据库也是如此。
JNDI
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 兼容服务器。学习配置它,并为您的特定添加条目凭据。
我应该在哪里存储我的 java 应用程序访问第三方服务的凭据?
我的应用程序中的凭据不是每个用户特定的。它们用于访问我的应用程序正在使用的 Web 服务。我知道不要将它们硬编码到我的应用程序中,但我应该在哪里以及如何存储它们?我还假设它们需要加密。
- Db
- .属性文件
- 配置 class 常量
Spring 具有很好的 @Value 注释功能,可以使用给定的键从 .properties 文件(在 resources 文件夹下)自动注入值。
我使用它是因为在我的例子中,我在多个应用程序实例中有不同的键值,而 db 将需要更多的复杂性,而且我不会对 db 进行不必要的查询。
在安全基础上,如果攻击者可以读取您服务器上的文件,那么他就可以轻松读取您的数据库,因此不要在这里发挥作用。它可以存储在系统上的任何文件中。
另一方面,您可以使用
配置 classpublic static final String SECRET_KEY = "someKey"
.jar 文件是存储所有凭据的最佳方式。
- 创建界面,将您的凭据存储为最终字符串
- 将接口转换为 jar 文件
- 将该 jar 文件添加到您的构建路径中
- 在您使用凭据的地方实现此接口,并访问您存储凭据的字符串对象。
以@Zildyan 的回答、评论和对其他答案的引用为基础。
有几个选项可以存储:
- 数据库
- 属性文件
- 常量(硬编码)
- 文件系统(远离应用程序)
至于如何存储:
取决于灵敏度。凭据可以以纯文本形式存储(低敏感度)或应该加密(高敏感度)。
还应注意,结合使用加密和将凭据与源分开会限制对凭据的内部访问。
一些例子
- 可以将以纯文本形式存储的密码添加到源代码管理中,任何有权访问源代码管理的人都可以阅读。
- 任何能够运行密码的人都可以轻松获得带有解密代码的加密密码。
- 任何有权访问服务器的人都可以访问存储在服务器上的纯文本文件。
- 存储在文件系统上的加密文件可能只有系统管理员可以访问,并且解密方法可供开发人员使用。
存储在数据库中以及谁有权访问该数据库也是如此。
JNDI
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 兼容服务器。学习配置它,并为您的特定添加条目凭据。