2012-07-07 124 views
2

我敢肯定,这已被问过,但我找不到任何答案这个问题。春季安全与休眠,存储加密密码

使用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会如何知道我的盐是“盐” - 你如何告诉春季安全以及Hibernate使用相同的盐?我是否缺少有关spring security如何管理密码的内容?

回答

4

推荐的方法是使用标准密码编码器,该编码器将使用随机盐,并将该盐与消化的密码进行存储。这样,你不需要提供任何盐。如果您想提供自己的盐,那么您需要将SaltSource注入到DAO身份验证器中,如the documentation(并且当您编码密码以创建新用户时使用相同的源代码):

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

遗留的方法来处理盐是注入一个SaltSource到 DaoAuthenticationProvider的时候,这将获得用于 特定用户的盐值,并且将它传递给的PasswordEncoder。随机使用 盐,并将其与密码数据字段组合使用,意味着您不必担心盐处理的细节(例如存储值的位置),因为它全部在内部完成。因此,我们强烈建议您使用此方法 ,除非您已在 位置分别存储盐的系统。

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

+1

这些天推荐的选项是使用[BCrypt](http://stackoverflow.com/a/8528804/241990)。只需在你的Hibernate DAO中注入一个'BCryptPasswordEncoder'(或者在内部实例化一个),使用它来创建哈希并使用相同的bean进行验证。盐将自动处理。 – 2012-07-07 17:09:18

+0

@LukeTaylor:谢谢你提供的信息。 TODO:建议在文档中:-) – 2012-07-07 17:21:06