Хэширование и соляция паролей с помощью Spring Security 3 - PullRequest
15 голосов
/ 11 сентября 2011

Как я могу хэшировать пароли и использовать их в Spring Security 3?

Ответы [ 3 ]

20 голосов
/ 11 сентября 2011

Программно, вы можете сделать это следующим образом:

В вашем файле application-context.xml (определенном в web.xml в contextConfigLocation) определите bean-компонент (в этом примере используется md5).

<bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder" />

Затем автоматически подключите кодировщик пароля:

@Autowired
PasswordEncoder passwordEncoder;

В вашем методе или в любом месте, где вы хотите использовать хеш и соль.

passwordEncoder.encodePassword("MyPasswordAsString", "mySaltAsStringOrObject");

Вышеприведенный вызов должен вернутьсясоленый хеш (как String).

Это должно сделать это.Я предполагаю, что вы можете выяснить, какая банка вам понадобится.

ОБНОВЛЕНИЕ

Само собой разумеется, что использование MD5 - не лучшая идея.В идеале вы должны использовать SHA-256 как минимум.Это можно сделать с помощью ShaPasswordEncoder.

Замените приведенную выше конфигурацию bean-компонента MD5 на:

<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
     <constructor-arg value="256"/>
</bean>
7 голосов
/ 21 марта 2013

Простейшим представляется Spring Security 3.1, при условии отсутствия ограничений на способ хеширования:

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

<security:authentication-manager>
    <security:authentication-provider>
        <security:password-encoder ref="encoder"/>
        <security:jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select u.username, ur.authority from users u, user_roles ur where u.username = ur.username and u.username =?"/>
    </security:authentication-provider>
</security:authentication-manager>


@Controller
@Stateless
public class UsersEJB {
    @PersistenceContext(unitName = "somePU")
    private EntityManager em;
    @Transactional
    public void create(Users users) {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hashedPassword = passwordEncoder.encode(users.getPassword());
        users.setPassword(hashedPassword);
        em.persist(users);
    }
}
6 голосов
/ 14 августа 2012

Самый простой способ, как задокументировано :

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userDetailsService" >
        <password-encoder hash="sha">
            <salt-source user-property="username"/>
        </password-encoder>
    </authentication-provider>
</authentication-manager>

HTH

...