Установка пароля SSHA в LDAP из Spring

У меня возникли проблемы с тем, как сохранить пароль в Apache DS LDAP в хэше SSHA вместо простого текста. Насколько я могу судить, правильный способ сделать это - настроить Apache DS на использование SSHA для хранения паролей, а затем при установке пароля отправлять только обычный текст. Однако я не могу понять, как настроить Apache DS для этого.

Я ввел хешированный пароль в LDAP (используя интерфейс администратора для LDAP), и Apache DS правильно аутентифицируется по правильному паролю. Однако мне нужно вставить пароль из нашего Java-приложения. Это не может быть необычным запросом, поэтому я должен что-то упустить.

Вот мой код для установки пароля от java с использованием интерфейса LdapTemplate от org.springframework.ldap.core

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 к паролям, которые он получает.

Спасибо


person Ken    schedule 26.11.2013    source источник
comment
1) Обращались ли вы к документации по администрированию Apache DS, чтобы узнать, как настроить сервер для использования криптографического дайджеста для запросов MODIFY и ADD для рассматриваемого пользователя/ветки/серверной части? 2) Рассмотрите возможность использования расширенного запроса на изменение пароля (RFC3062) для изменения паролей, где это возможно.   -  person Terry Gardner    schedule 26.11.2013
comment
@TerryGardner Не могли бы вы немного уточнить свои предложения. Пока они мне мало чем помогли. Можете ли вы предоставить ссылку на часть документации Apache DS, на которую вы ссылаетесь?   -  person Ken    schedule 26.11.2013
comment
Похоже, Red Hat Directory Server будет работать именно так, как я надеюсь. Он также хорошо документирован и имеет эквивалент 389 Directory Server с открытым исходным кодом. Пока мое мнение об Apache DS низкое.   -  person Ken    schedule 27.11.2013
comment
Сегодня тоже была похожая проблема. В Windows откройте LDAP-браузер и перейдите к ou=config,ou=interceptors. Выберите ads-interceptorId=passwordHashingInterceptor и измените значение ads-interceptorclassname на любое по вашему выбору. Перезапустите службу, и все должно быть в порядке.   -  person pma    schedule 27.10.2015


Ответы (1)


Вы, как клиент, несете ответственность за хеширование и кодирование пароля. Сервер просто сохраняет его, как и любой другой атрибут.

Если вы хотите хэшировать пароль с помощью 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}, вы также должны адаптировать код.

person Community    schedule 19.02.2014