Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java生成的密码不适用于LDIF文件_Java_Spring_Ldap_Sha - Fatal编程技术网

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

Java生成的密码不适用于LDIF文件,java,spring,ldap,sha,Java,Spring,Ldap,Sha,我正在尝试一个使用LDIF的简单LDAP示例[LDIF-example][1]。我能够使用默认用户/通行证设置所有内容并正确运行它 但是,我正在尝试生成新用户,我使用下面的Java代码为“joe”生成密码,但它似乎不起作用: import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;

我正在尝试一个使用LDIF的简单LDAP示例[LDIF-example][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;
    }
以下是带有密码的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

我为乔使用的密码是“乔”,我似乎无法接受它。加密不同吗?顺便说一下,我正在用Windows

您可以将其用于SHA-512 您使用MessageDigest.getInstance的实例(“SHA-1”)-->MessageDigest.getInstance(“SHA-512”)

导入java.nio.charset.StandardCharset;
导入java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
公共字符串get_SHA_512_SecurePassword(字符串passwordToHash,字符串salt){
字符串generatedPassword=null;
试一试{
MessageDigest md=MessageDigest.getInstance(“SHA-512”);
md.update(salt.getBytes(StandardCharsets.UTF_8));
byte[]bytes=md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));
StringBuilder sb=新的StringBuilder();
for(int i=0;i

请检查此问题

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

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

此外,哈希算法的实际输出是二进制数据,可以用十六进制或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);
    
  • 如果不想加盐,则需要注释掉以下行(对于空的salt字符串,它仍然是“salt”,并且不会产生与不加盐相同的输出):

  • 根据上述要点设置适当的存储方案前缀。例如,将SHA-1与salt一起使用时,ldif中的密码属性值应如下所示:

    userPassword: {SSHA}<base64_encoded_hash>
    
    userPassword:{SSHA}
    

<强>其他需要考虑的事项:>/P>

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

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

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


另见:14.4。密码存储来自

否这不是问题所在。我确实看到了。问题是将其存储在LDIF文件中并接受。由于某些原因,我无法接受它。您所指的示例缺少其url。实际上,我不知道LDIF中salt的语法,因此我将其取出,在另一次尝试中根本没有使用salt。另外,除了告诉它是咸的之外,你还需要提供盐的价值吗?所以假设我不需要salt(我只是使用这个实现,直到我们实现了证书),只需要对LDIF的密码进行简单的加密。我能做什么?顺便说一下,我确实尝试使用java代码来创建SHA-1“Ben”,但没有得到与我认为应该匹配的LDIF相同的结果。或者考虑使用一个盐(您在函数中所做的,无论它是什么字符串,它都是空的),并且使用相应的{sSH},或者不使用{SHA}。同时,我意识到您使用的是SHA512,如果我之前没有看到这个,很抱歉,但是如果您不首先设置特定的配置,可能会出现问题。我将很快编辑这篇文章以澄清问题。不,我是对的我被@bipil raut对sha512用例的回答所吸引。我将重新编辑以避免混淆。:)好的,我只是测试了一下,没用。我将代码更新为上面的代码,并使用基本级别的sha-1。我尝试过编码,但它似乎使字符串变长而不是变短。我注意到用户“ben”的原始密码是“benspassword”,其编码字符串是“{SHA}nfcebwjxfalbhghg1qk5uuu4trbvq=”。我的用户“Joe”,我也使用了“benspassword”,使用上面的方法生成了一个字符串“{SHA}9C509E6D68F17DA2DB1C71B54E54538B6B6EF4”。它们应该是相同的,因为不涉及盐?是的,它们应该是相同的,但它们不是:“9C509E6D68F17DA2DB1C71B544E54538B6EF4”“不是base64,但仍然是六进制字符串。我刚刚添加了另一个使用java.util包在base64中编码字符串的示例。现在由你来导入正确的,因为我猜不出来。当您只是比较十六进制字符串和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));
userPassword: {SSHA}<base64_encoded_hash>