Сгенерированный Java пароль не работает с файлом LDIF - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь простой пример LDAP с использованием LDIF отсюда [пример 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

Пароль, который я использовал для Джо, это "Джо", и я не могу, кажется,принять это.Отличается ли шифрование?Я использую Windows, кстати.

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Ваша функция выглядит нормально и должна выдавать правильный соленый хеш 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 с солью значение атрибута пароля в ldif должно выглядеть следующим образом:

    userPassword: {SSHA}<base64_encoded_hash>
    

Несколько других факторов, которые следует учитывать:

  • OpenLDAP поддерживает следующую схему шифрования: SHA, SSHA, MD5, SMD5 и CRYPT.

  • SHA и SSHA оба используют алгоритм SHA-1.

  • Чтобы обеспечить поддержку SHA-2 и его вариантов, используйте оверлей slapd's pw-sha2 (поддержка SHA-224, SHA-256, SHA-384,США-224, США-256, США-384).Он может быть статически скомпилирован с использованием slapd или загружен динамически, поскольку в нем включена поддержка модуля.

См. Также: 14.4.Хранение пароля от https://www.openldap.org/doc/admin24/security.html

0 голосов
/ 21 июня 2019

вы можете использовать это для SHA-512 Вы используете экземпляр MessageDigest.getInstance ("SHA-1") -> MessageDigest.getInstance ("SHA-512");

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

public String get_SHA_512_SecurePassword(String passwordToHash, String   salt){
String generatedPassword = null;
    try {
         MessageDigest md = MessageDigest.getInstance("SHA-512");
         md.update(salt.getBytes(StandardCharsets.UTF_8));
         byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));
         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;
}

Пожалуйста, проверьте этот вопрос Как хэшировать пароль с sha-512-in-java

...