我在研究如何在Apache DS LDAP中以SSHA散列而不是纯文本形式保存密码时遇到了问题。据我所知,正确的方法应该是将Apache DS配置为使用SSHA存储密码,然后在设置密码时只发送纯文本。但是,我不知道如何配置Apache DS来做到这一点。
我已经将散列密码推送到LDAP中(使用LDAP的Admin接口),Apache DS根据正确的密码进行了正确的身份验证。但是,我需要插入来自我们的Java应用程序的密码。这不可能是一个不寻常的请求,所以我一定遗漏了什么。
下面是我使用org.springframework.ldap.core的LdapTemplate接口在java中设置密码的代码
public void storeNewPassword(final String userId, final String password) {
final DistinguishedName dn = new DistinguishedName("dc=users,dc=pms,dc=com");
dn.add("uid", userId);
Attribute pass = new BasicAttribute("userpassword", password);
final ModificationItem mi = new ModificationItem(
DirContext.REPLACE_ATTRIBUTE,
pass);
ldapTemplate.modifyAttributes(dn, new ModificationItem[] {mi});
}上面的代码正确地设置了密码,但是当我查看Apache DS Server时,我看到密码是以纯文本格式保存的:
请有人验证这是否是设置密码的正确方法,并建议我如何配置Apache DS以将SSHA应用于它收到的密码。
谢谢
发布于 2014-02-19 23:36:08
您作为客户端负责对密码进行散列和编码。服务器只是像存储任何其他属性一样存储它。
如果你想使用MD5散列密码,你可以使用如下代码:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
public class PasswordUtil {
public String hashAndEncodePassword(String password) {
final byte[] md5 = DigestUtils.md5(password.trim().getBytes("UTF-8"));
final byte[] base64 = Base64.encodeBase64(md5);
final String hashedAndEncoded = new String(base64, "ASCII");
return "{MD5}" + hashedAndEncoded;
}
}如果要使用不同的哈希算法,则必须将DigestUtils.md5的使用更改为正确的方法。
如果你想使用像{SSHA}这样的加盐算法,你也必须调整代码。
https://stackoverflow.com/questions/20220983
复制相似问题