Spring Security with Hibernate,存储加密密码
Posted
技术标签:
【中文标题】Spring Security with Hibernate,存储加密密码【英文标题】:Spring security with Hibernate, store encrypted passwords 【发布时间】:2012-07-07 17:47:32 【问题描述】:我确定以前有人问过这个问题,但我找不到任何可以回答这个问题的东西。
使用 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 Security 以及 Hibernate 使用一样的盐吗?我是否遗漏了有关 Spring Security 如何管理密码的内容?
【问题讨论】:
【参考方案1】:推荐的方法是使用一个标准的密码编码器,它会使用一个随机的盐,并将这个盐与消化后的密码一起存储。这样,您不需要提供任何盐。如果您想提供自己的盐,则需要将 SaltSource 注入 DAO 身份验证器,如 the documentation 所述(当然,在对密码进行编码以创建新用户时使用相同的源):
crypto包中的StandardPasswordEncoder使用一个随机的8字节 salt,与密码存储在同一字段中。
注意
处理盐的传统方法是将 SaltSource 注入 DaoAuthenticationProvider,它将获得一个盐值 特定用户并将其传递给 PasswordEncoder。使用随机 salt 并将其与密码数据字段相结合意味着您不需要 必须担心盐处理的细节(例如 值被存储),因为这一切都是在内部完成的。所以我们强烈 建议您使用这种方法,除非您已经有一个系统 单独存放盐的地方。
在您的情况下, SaltSource 将始终返回“盐”。请注意,这种加盐方式是不安全的,因为所有共享共同密码的用户(是的,确实如此)最终都会使用相同的散列密码。这意味着攻击者在找到一个用户的密码时,也会找到共享相同密码的所有用户的密码。
【讨论】:
现在推荐的选项是使用BCrypt。只需将BCryptPasswordEncoder
注入您的 Hibernate DAO(或在内部实例化一个),使用它来创建哈希并使用相同的 bean 进行身份验证。盐会自动处理。
@LukeTaylor:感谢您提供的信息。 TODO:在文档中推荐 :-)以上是关于Spring Security with Hibernate,存储加密密码的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security with Hibernate,存储加密密码
spring 3.1 with hibernate 4 with spring security 3.1:如何确保包含所有依赖项以及要包含哪些标签?
Spring Boot & Security with AngularJS 登录页面
Spring Data Rest with Spring Security - 按当前用户查找所有内容
Spring security Basic Authentication - 401 Unauthorized with correct credentials
How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway