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 如何知道我的盐是“盐”——你如何告诉 Spring Security 和 Hibernate 使用相同的盐? 我是否遗漏了有关 Spring Security 如何管理密码的信息?

4

1 回答 1

4

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

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

笔记

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

在您的情况下, SaltSource 将始终返回“盐”。请注意,这种加盐方式是不安全的,因为所有共享共同密码的用户(是的,确实如此)最终都会使用相同的散列密码。这意味着攻击者在找到一个用户的密码时,也会找到共享相同密码的所有用户的密码。

于 2012-07-07T15:42:32.287 回答