为基于Wildfly容器的身份验证生成加盐/散列密码

时间:2018-08-23 21:42:22

标签: java jboss wildfly jdbcrealm elytron

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

我的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)
);

要生成加盐/哈希密码,我使用了以下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);

使用password的密码和12345678的盐,我得到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进行任何工作,仅散列密码而不加盐,因此我认为配置或数据库设置没有任何问题。只是在切换到{{1}}并使用盐之后,帐户才能通过身份验证。

1 个答案:

答案 0 :(得分:0)

盐也应使用base64版本。因此,在您的情况下,盐应该是MTIzNDU2NzgK

echo "12345678" | base64 MTIzNDU2NzgK

Se [1]关于主题的某些上下文 [1] https://issues.jboss.org/browse/ELY-1444