Как проверить соленый пароль в Spring Security?

Я использую Spring 3 и получаю пользователей из базы данных MySQL.

Прямо сейчас, при тестировании, у меня есть пользователь с паролем MD5. И я могу отлично аутентифицироваться, используя это.

Однако мы хотим быть немного более безопасными в том, как мы хэшируем пароли. Мы хотим:

MD5(username + salt + password)

Соль — это случайная строка, хранящаяся в записи пользователя. Но я не могу понять, где/как это сделать. Это то, что у меня есть до сих пор:

Дао пользователя

public class UserDao {

    public static Users findUserByUsername(String paUsername) {
        String hql = "from Users where username = :username";

        List<Users> list = null;
        Users user = null;

        try {
            IO io = new IO("web");   // custom Hibernate framework
            IOQuery query = new IOQuery();
            query.setStatement(hql);
            query.setParameter(new IOParameter("username", paUsername));

            list = io.runQuery(query);

            if (list.isEmpty()) {
                return null;
            }

            return list.get(0);

        } catch (Exception ex) {
            return null;
        }
    }
}

UserDetailsServiceImpl

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String paUsername) throws UsernameNotFoundException {
        Users user = userDao.findUserByUsername(paUsername);

        if(user == null) {
            throw new UsernameNotFoundException("User not found");
        }

        return new User(
                user.getUsername(),
                user.getPassword(),
                user.getEnabled(),
                true,
                true,
                true,
                getAuthorities(Enums.UserRoles.IT));
    }

    private Collection<? extends GrantedAuthority> getAuthorities(Enums.UserRoles paRole) {
        List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(paRole));
        return authList;
    }

    private List<String> getRoles(Enums.UserRoles paRole) {
        List<String> roles = new ArrayList<>();

        if (paRole.equals(Enums.UserRoles.USER)) {
            roles.add(Enums.UserRoles.USER.name());
        } else if (paRole.equals(Enums.UserRoles.IT)) {
            roles.add(Enums.UserRoles.USER.name());
            roles.add(Enums.UserRoles.IT.name());
        }

        return roles;
    }

    private static List<GrantedAuthority> getGrantedAuthorities(List<String> paRoles) {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (String role : paRoles) {
            authorities.add(new SimpleGrantedAuthority(role));
        }
        return authorities;
    }
}

Сервис Деталей пользователя

public class UserDetailService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return new UserDetailsServiceImpl().loadUserByUsername(username);        
    }
}

контекст-приложения-безопасности

<beans:bean id="loginSuccessHandler" class="com.myapp.security.LoginSuccessHandler" />
<beans:bean id="loginFailureHandler" class="com.myapp.security.LoginFailureHandler" />
<beans:bean id="detailsService" class="com.myapp.security.UserDetailService" />

Любые идеи о том, что мне нужно сделать?

Спасибо


person cbmeeks    schedule 08.06.2012    source источник


Ответы (2)


Это фрагмент конфигурации безопасности, которую мое приложение использует для установки кодировки пароля:

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="authenticationProvider" />
</sec:authentication-manager>


<bean id="authenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsServiceImpl"/>
    <property name="passwordEncoder" ref="cryptoPasswordEncoder" />
</bean>


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

Нам не нужно устанавливать источник Salt в DaoAuthenticationProvider, поскольку BCryptPasswordEncoder использует собственный.

person Luciano    schedule 08.06.2012

Использовать :

public class PasswordEncoder extends org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder{             

    public PasswordEncoder() {
        super("MD5");
    }

    @Override
    public String encodePassword(String originalPassword, Object salt) {
            // here supply salt = username + saltString
        String encryptedPassword =  super.encodePassword(originalPassword, salt);           
        return encryptedPassword;
    }

}
person Nandkumar Tekale    schedule 08.06.2012
comment
Как мне заставить Spring ссылаться на это? - person cbmeeks; 08.06.2012
comment
@cbmeeks используют String encryptedPassword = new PasswordEncoder().encodePassword(pass, salt);. Проверьте API для MessageDigestPasswordEncoder здесь static.springsource.org/spring-security/site/docs/3.0.x/apidocs/ - person Nandkumar Tekale; 19.06.2012