реализация весенней безопасности с помощью ldap и кодирования паролей

Я успешно реализовал вход в систему Spring Security с помощью ldap и открытого текста. теперь я переключаюсь на sha-256 для хэша пароля в ldap. я добавил кодировщик паролей в applicationContext-security.xml. однако мне не удалось успешно пройти аутентификацию с помощью Spring Security. я получаю "вы ввели неверный логин или пароль!"

вот мои коды:

applicationContext-security.xml

  <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:security="http://www.springframework.org/schema/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

        <security:http auto-config="true" use-expressions="true" access-denied-page="/user/denied" >
            <security:form-login
                    login-page="/login" 
                    authentication-failure-url="/login?error=true" 
                    default-target-url="/admin/user"/>
            <security:logout invalidate-session="true" 
                    logout-success-url="/login" 
                    logout-url="/j_spring_security_logout"/>
        </security:http>
        <security:authentication-manager>
            <security:ldap-authentication-provider user-search-filter="uid={0}" user-search-base="ou=Users">
             <security:password-compare>
                 <security:password-encoder hash="sha-256" />
             </security:password-compare>
           </security:ldap-authentication-provider>
        </security:authentication-manager>

        <bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
            <constructor-arg value="ldap://192.168.1.100:389/dc=openLDAP" />
            <property name="userDn" value="cn=admin,dc=openLDAP" />
            <property name="password" value="password" />
        </bean>
</beans>

контроллер входа:

@RequestMapping(value="/login", method=RequestMethod.GET)
public String login(@RequestParam(value="error", required=false) boolean error, ModelMap model, HttpServletRequest request) {
   HttpSession session = request.getSession();
   if(session.getAttribute("SPRING_SECURITY_CONTEXT" != null) {
      return "redirect:/home";
   }

   if(error) {
      model.put("error", "you have entered an invalid username or password!");
   }
   else {
      model.put("error", "");
   }

   return "login";
}

вид входа:

<form action="j_spring_security_check" method="post" >
   username: <input id="j_username" name="j_username" type="text" />
   password: <input id="j_password" name="j_password" type="password" />
</form>

person chrizonline    schedule 06.01.2014    source источник
comment
Можете ли вы напрямую выполнить привязку с пользователем и паролем на вашем сервере ldap?   -  person Ralf    schedule 06.01.2014
comment
А вы видите хэш пароля в каталоге?   -  person Ralf    schedule 06.01.2014
comment
привет в apacheLDAP, я дважды щелкаю значение пароля, и он открывает редактор паролей. я сделал две вещи. 1) в поле подтверждения пароля я ввожу свой пароль и привязываюсь к открытому тексту. оно работает. 2) я попробовал то же самое сейчас для sha256, и он возвращает Аутентификация не удалась. [Код ошибки LDAP 49 — неверные учетные данные]   -  person chrizonline    schedule 06.01.2014
comment
привет, когда я сохраняю свой пароль, в поле значения отображается хешированный пароль SHA-256   -  person chrizonline    schedule 06.01.2014
comment
Можете ли вы попробовать сохранить pwd, хэшированный с помощью MD5, SMD5 или SHA, а затем повторить попытку? Это три, которые работали у меня из коробки с OpenLDAP.   -  person Ralf    schedule 06.01.2014
comment
я изменил хэш-алгоритм в соответствии с вашим предложением, и он работает на apacheDS. я использую apacheDS для подключения к openLdap. однако я все еще не могу войти в свой весенний проект после того, как я перешел на ‹security:password-encoder hash=md5 /›   -  person chrizonline    schedule 06.01.2014


Ответы (1)


Я думаю, ваша проблема в том, что вы хешируете пароль на стороне клиента (spring-security), а затем OpenLDAP снова хэширует эту строку, а затем сравнивает результат с сохраненным хэшем пароля. Одна из двух комбинаций должна работать:

  1. Настройте алгоритм хеширования в spring-security и сохраните хэш пароля в виде обычного текстового пароля в OpenLDAP -> Хешированный пароль отправляется на ваш LDAP и сравнивается с сохраненным хешированным паролем.
  2. Не настраивайте хеширование в spring-security и сохраняйте пароль как тип хешированного пароля в OpenLDAP (как вы сделали в соответствии с вашим комментарием) -> Пароль в виде обычного текста отправляется на ваш LDAP, хэшируется сервером LDAP, а затем сравнивается с сохраненный хэш пароля.

Я рекомендую 2) в сочетании с зашифрованным SSL-соединением с вашим сервером LDAP для защиты простого текстового пароля при передаче. Если вы выберете 2), вы можете легко включить соление хэшей ваших паролей, используя тип пароля SMD5. 1) имеет тот недостаток, что каждый клиент должен поддерживать выбранную хеш-функцию.

person Ralf    schedule 06.01.2014
comment
привет Ральф, решение 1 работает. большое спасибо. в настоящее время я использую sha256 в весенней безопасности. я читал, что Spring Security поддерживает только следующий алгоритм хеширования: открытый текст, sha, sha-256, md5 и md4. я хотел бы использовать более безопасный алгоритм, такой как sha512. можно ли реализовать это в весенней безопасности? - person chrizonline; 07.01.2014
comment
Насколько я знаю, вы бы выиграли больше с точки зрения безопасности, если бы посолили свои хэши вместо использования более длинного варианта хэш-значения того же алгоритма криптографического хеширования. Если ответ был полезен, не могли бы вы проголосовать и/или принять ответ как правильный? - person Ralf; 07.01.2014
comment
Спасибо, Ральф, думаю, я так и сделаю - person chrizonline; 07.01.2014