为基于Wildfly容器的身份验证生成salted /哈希密码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为基于Wildfly容器的身份验证生成salted /哈希密码相关的知识,希望对你有一定的参考价值。

我无法使用基于Elytron的容器身份验证为Wildfly 13中的新用户生成正确的salted / hashed密码。

我的standalone.xml文件包含以下jdbc-realm条目

<jdbc-realm name="TestDbRealm">
    <principal-query sql="SELECT password,salt,role FROM users WHERE username=?" data-source="YacDS">
        <attribute-mapping>
            <attribute to="groups" index="3"/>
            </attribute-mapping>
            <salted-simple-digest-mapper algorithm="password-salt-digest-md5" password-index="1" salt-index="2"/>
    </principal-query>
</jdbc-realm>

我的数据源的users表生成如下:

CREATE TABLE users (
  id SERIAL,
  username VARCHAR(255),
  password VARCHAR(255),
  salt CHAR(8),
  role VARCHAR(255),
  PRIMARY KEY (id),
  UNIQUE (username)
);

为了生成salted / hashed密码,我使用了以下Java:

String text = "password";
String salt = "12345678";
text = text + salt;
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
System.out.println(encoded);

使用密码password12345678的盐,我得到u7Dd/xuUSzzGjqrresIAmQ==作为盐渍和哈希密码。我使用该语句在我的数据库中插入了它

INSERT users(username, password, salt, role) VALUES ('user', 
'u7Dd/xuUSzzGjqrresIAmQ==', '12345678', 'testRole');

但是,如果我使用userpassword的用户名/密码组合登录我的应用程序,它拒绝验证我。

我相信问题在于我在哈希之前将盐应用于密码的方式,但我找不到任何文档来描述在使用盐时应如何生成password字段的数据库值。

我能够使用simple-digest-mapper而不是salted-simple-digest-mapper工作,只是在不使用盐的情况下散列密码,所以我认为配置或数据库设置没有任何问题。只有在切换到salted-simple-digest-mapper并使用盐后,帐户才能进行身份验证。

答案

盐也应该是基础64。所以在你的情况下,盐应该是MTIzNDU2NzgK

echo "12345678" | base64 MTIzNDU2NzgK

Se [1]对于主题[1] https://issues.jboss.org/browse/ELY-1444的某些背景

以上是关于为基于Wildfly容器的身份验证生成salted /哈希密码的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 24 中带有 Elytron 的多个 sasl 身份验证机制

Wildfly 8 基本身份验证

比较安全的cookie验证登录设计方案

如何在 Wildfly 中提供自定义身份验证/授权管理器

使用对Wildfly 10的远程EJB调用进行身份验证时出现问题

使用 WildFly 在 JMS 中进行 JAAS 身份验证:javax.jms.JMSSecurityException:HQ119032:用户:null 没有权限 = 在地址 2 上发送