在wildfly上存储用户名和密码并使用java获取

watbbzwu  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(152)

我需要在wildfly中存储ldap用户名和密码。我做了如下,但我的经理说我这样做不安全:

String ldapCredentials = System.getProperty("ldap.user");
    byte[] credDecoded = Base64.getDecoder().decode(ldapCredentials == null ? "" : ldapCredentials);
    String credentials = new String(credDecoded, StandardCharsets.UTF_8);
    String[] ldapDecoded = credentials.split(",");
    ldapSearchUser = ldapDecoded[0];
    ldapSearchPassword = ldapDecoded[1];

在单机版中:

<system-properties>
    <property name="ldap.user" value="randomvaluebase64"/>
</system-properties>

他告诉我,我需要使用安全默认的wildfly,我发现了很多关于它的东西,但我无法找到如何在java中获取比,任何想法?

vojdkbi0

vojdkbi01#

我提供的原始答案仅适用于WildFly 23或更新版本。我会把它放在正确答案下面以供参考。

您将希望使用凭据存储,它使用JavaKeyStore加密内容。链接的文档将详细介绍,但this example class将展示如何检索凭证存储的内容。
要保护凭据存储区密码本身的安全,您有几个选项:

  • 从shell命令(source code)的输出中读取密码。**这是我推荐的唯一方法,因为密码不能存储在配置文件中。**例如,此CLI命令将使用环境变量作为密码创建凭据存储区:
[standalone@localhost:9990 /] /subsystem=elytron/credential-store=cs:add(location=credstore.cs,relative-to=jboss.server.config.dir,\
credential-reference={type=command,clear-text="echo $SECURE_ENV_VAR"},create=true)
  • 以纯文本形式存储密码。考虑到这些限制,这不是一个现实的选择。
  • 使用Elytron工具,您可以创建一个具有哈希和加盐密码的凭据存储。然而,这是一个纯粹的兼容性特性,并且所使用的算法(PBEwithMD5andDES)现在是可强制执行的,所以我不推荐它,并且不会包含如何执行的说明。

如果您能够升级到WildFly 23或更高版本,您将可以访问一个更安全的选项,如下所述。

至于添加LDAP凭据(以及保护凭据存储本身的密码),this blog post解释了如何将它们与加密表达式一起使用。这允许您在服务器配置中存储凭据存储区密码的加密副本。

  • 注意:虽然看起来你可以直接使用加密的表达式来存储LDAP凭证,但它不会在非安全的上下文中被解析,并且可能不会在Java类中工作。*

相关问题