gpt4 book ai didi

Java 生成的密码不适用于 LDIF 文件

转载 作者:行者123 更新时间:2023-11-30 05:35:35 24 4
gpt4 key购买 nike

我正在尝试使用此处的 LDIF 的简单 LDAP 示例 [LDIF 示例][1]。我能够设置所有内容并使用默认用户/密码正确运行它。

但是,我正在尝试生成新用户,并使用下面的 Java 代码为“joe”生成密码,但它似乎不起作用:

 import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

private static String get_SHA_1_SecurePassword(String passwordToHash)
{
String generatedPassword = null;

try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] bytes = md.digest(passwordToHash.getBytes());
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
generatedPassword = sb.toString();

}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return generatedPassword;
}

上面示例链接中用于检查密码的代码:

public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid={0},ou=people")
.groupSearchBase("ou=groups")
.contextSource()
.url("ldap://localhost:8389/dc=springframework,dc=org")
.and()
.passwordCompare()
.passwordEncoder(new LdapShaPasswordEncoder())
.passwordAttribute("userPassword");
}

这是带有密码的 LDIF 文件片段:

  //working copy for ben from example
dn: uid=ben,ou=people,dc=springframework,dc=org
dn: uid=ben,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben Alex
sn: Alex
uid: ben
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=

//new user "joe"
dn: uid=joe,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Joe S
sn: joe
uid: joe
userPassword: {SHA}9c509e6d68f17da2db1c71b5424e54538b6b6ef4

我为 joe 使用的密码是“joe”,但我似乎无法接受它。加密方式有什么不同吗?顺便说一句,我正在使用 Windows。

最佳答案

您的函数看起来不错,应该输出正确的加盐 SHA-1 哈希值。

但是,LDIF 文件中的存储方案前缀应该是 {SSHA}(对于加盐 SHA1)而不是 {SHA} - 或者您不打算使用盐(?)。

此外,哈希算法的实际输出是二进制数据,可以用十六进制或 Base64 字符串表示。 LDAP存储方案使用base64编码。

你能做什么?

  • 在您的 LDIF 中,我们可以识别十六进制字符串,因此第一件事是根据导入的 base64 包以 Base64 而不是十六进制编码该哈希:

    // Using org.apache.commons.codec.binary.Base64 
    generatedPassword = Base64.encodeBase64String(bytes);

    // Using java.util.Base64
    generatedPassword = Base64.getEncoder().encodeToString(bytes);
  • 如果您不想加盐,则需要注释掉以下行(使用空盐字符串,它仍然是“盐”,并且不会产生与不加盐相同的输出):

    md.update(salt.getBytes(StandardCharsets.UTF_8));
  • 根据上述要点设置正确的存储方案前缀。例如,使用 SHA-1 和 salt,ldif 中的密码属性值应如下所示:

    userPassword: {SSHA}<base64_encoded_hash>

需要考虑的其他一些事项:

  • OpenLDAP 支持以下加密方案:SHA、SSHA、MD5、SMD5 和 CRYPT。

  • SHA 和 SSHA 都使用 SHA-1 算法。

  • 要支持 SHA-2 及其变体,请使用 slapd 的 pw-sha2覆盖(支持 SHA-224、SHA-256、SHA-384、SSHA-224、SSHA-256、SSHA-384)。它可以使用 slapd 静态编译,也可以动态加载,因为它启用了模块支持。

另请参阅:14.4。密码存储来自 https://www.openldap.org/doc/admin24/security.html

关于Java 生成的密码不适用于 LDIF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56708138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com