无法验证Java - LDAP

时间:2016-10-05 11:03:33

标签: java ldap opendj

我的ldiff文件看起来像这样

dn:uid=test,ou=users,dc=example,dc=com
objectclass:person
objectclass:inetOrgPerson
objectclass:organizationalPerson
objectclass:top
givenName: test
title:test
uid:test
cn:test
sn:sdf
userPassword: 81dc9bdb52d04dc20036dbd8313ed055
mail: test@yopmail.com
creatorsName: cn=Directory Manager,cn=Root DNs,cn=config
modifiersName: cn=Directory Manager,cn=Root DNs,cn=config

使用带有十六进制编码的MD5在门户网站数据库中对userPassword进行哈希处理。 还启用了预编码密码为true但没有帮助。

上述userPassword的纯文本密码为“1234”,我有一个示例java程序来验证相同的

public static void main(String[] args) throws NamingException {

        final String ldapAdServer = "ldap://0.0.0.0:389";


        final String ldapUsername = "uid=test,ou=People,dc=example,dc=com";
        final String ldapPassword = "81dc9bdb52d04dc20036dbd8313ed055;


        Hashtable<String, Object> env = new Hashtable<String, Object>();
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        if (ldapUsername != null) {
            env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
        }
        if (ldapPassword != null) {
            env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
        }
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapAdServer);

        env.put("java.naming.ldap.attributes.binary", "objectSID");
        DirContext ctx = new InitialDirContext(env);

    }

替换java程序中的userPassword总是会出现“Invalid Authentication Exception”

附件是OpenDJ的设置 OPENDJ Passpword policy

我的要求是我们有一个门户网站,其密码存储在MD5中的db中,并使用十六进制编码将门户网站集成到ldap,每次更改密码,ldap都使用散列值更新,但上述java程序根本不起作用。 需要认真的帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

您需要以二进制格式存储密码哈希。您可以在LDIF文件中使用“::”而不是“:”将属性名称与值分隔开来:

dn:uid=test,ou=users,dc=example,dc=com
objectclass:person
objectclass:inetOrgPerson
objectclass:organizationalPerson
objectclass:top
givenName: test
title:test
uid:test
cn:test
sn:sdf
userPassword:: 81dc9bdb52d04dc20036dbd8313ed055
mail: test@yopmail.com
creatorsName: cn=Directory Manager,cn=Root DNs,cn=config
modifiersName: cn=Directory Manager,cn=Root DNs,cn=config

答案 1 :(得分:0)

在OpenDJ中,当您添加或导入密码时,服务器将仅保留其密码版本,为此,它使用密码策略中为用户配置的密码存储方案(或导入策略)。 / p>

但是,除非检测到密码已经使用已知方案进行了哈希处理,否则它始终会计算哈希值。方案由{SSHA1}{MD5}等前缀标识。

由于您的用户的密码已经使用MD5进行了哈希处理,并且OpenDJ具有使用MD5进行哈希处理的方案,因此您应该确保用户密码与OpenDJ产生或期望的代码具有相同的表示。

格式为:

  

userPassword:{MD5} Base64EncodingOftheMD5Hash

在LDIF中拥有此格式的所有用户密码后,您可以在OpenDJ中添加或导入它们,但请确保将密码策略设置为接受预先编码的密码(allow-pre-encoded-passwords),因为它&#39;不是默认值。

您可以使用OpenDJ编码密码工具生成示例编码值:

$ encode-password -s MD5 -c password
Encoded Password:  "{MD5}X03MO1qnZdYdgyfeuILPmQ=="