我无法使用基于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');
但是,如果我使用user
:password
的用户名/密码组合登录我的应用程序,它将拒绝对我进行身份验证。
我认为问题在于我在对哈希值进行哈希处理之前将盐应用到密码上,但是我找不到任何文档来描述使用password
字段时应如何生成simple-digest-mapper
字段的数据库值盐。
我能够使用salted-simple-digest-mapper
而不是salted-simple-digest-mapper
进行任何工作,仅散列密码而不加盐,因此我认为配置或数据库设置没有任何问题。只是在切换到{{1}}并使用盐之后,帐户才能通过身份验证。
答案 0 :(得分:0)
盐也应使用base64版本。因此,在您的情况下,盐应该是MTIzNDU2NzgK
echo "12345678" | base64
MTIzNDU2NzgK
Se [1]关于主题的某些上下文 [1] https://issues.jboss.org/browse/ELY-1444