4

我在解决如何将 Apache DS LDAP 中的密码保存在 SSHA 哈希而不是纯文本中时遇到问题。据我所知,正确的方法应该是将 Apache DS 配置为使用 SSHA 存储密码,然后在设置密码时仅发送纯文本。但是,我不知道如何配置 Apache DS 来执行此操作。

我已将散列密码推送到 LDAP(使用 LDAP 的管理界面)并且 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 服务器时,我看到密码已以纯文本形式保存:

请有人验证这是否是设置密码的正确方法,并建议我如何配置 Apache DS 以将 SSHA 应用于它收到的密码。

谢谢

4

1 回答 1

3

您作为客户端负责对密码进行散列和编码。服务器只是像任何其他属性一样存储它。

如果要使用 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},您也必须调整代码。

于 2014-02-19T15:36:07.780 回答