使用Hibernate进行Spring安全性,存储加密密码

时间:2012-07-07 15:28:29

标签: spring hibernate spring-security

我确定之前已经问过这个问题,但我找不到任何能解决这个问题的方法。

使用Spring-security,我正在使用密码编码器。

<beans:bean class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" id="passwordEncoder"/>


    <authentication-manager>
         <authentication-provider user-service-ref='CustomUserDetailsService'>
         <password-encoder ref="passwordEncoder"/>
         </authentication-provider>
    </authentication-manager>

在我的UserDAOImpl中,我在添加用户时有以下代码...

@Override
public void addUser(final User user) {
    user.setPassword(passwordEncoder.encodePassword(user.getPassword(), "salt"));
    sessionFactory.getCurrentSession().save(user);
}

我的密码被正确编码,但总是被认为是无效的,这是有道理的,因为我不知道Spring怎么会知道我的盐是“盐” - 你如何告诉Spring安全以及Hibernate使用同样的盐?我错过了关于Spring安全管理密码的方法吗?

1 个答案:

答案 0 :(得分:4)

推荐的方法是使用标准密码编码器,它将使用随机盐,并将此盐与消化密码一起存储。这样,您就不需要提供任何盐。如果你想提供自己的salt,那么你需要将一个SaltSource注入到DAO身份验证器中,如the documentation所述(当然,在对密码进行编码以创建新用户时使用相同的源): / p>

  

crypto包中的StandardPasswordEncoder使用随机的8字节   salt,与密码存储在同一个字段中。

     

请注意

     

处理salt的传统方法是注入SaltSource   DaoAuthenticationProvider,它将获得a的salt值   特定用户并将其传递给PasswordEncoder。随机使用   salt并将其与密码数据字段相结合意味着您没有   不得不担心盐处理的细节(例如   值存储),因为它都是在内部完成的。所以我们强烈要求   建议你使用这种方法,除非你已经有一个系统   分别储存盐的地方。

在您的情况下,SaltSource将始终返回“salt”。请注意,这种sa​​lting方式是不安全的,因为所有共享公共密码的用户(是的,它发生)最终都会使用相同的哈希密码。这意味着攻击者找到一个用户的密码也会找到共享相同密码的所有用户的密码。