4

我检查了这个论坛和文档,但没有找到这个问题的答案,也就是说,我怎样才能使用基本的 java 对象作为 MD5 编码的盐来进行基本的 Spring Security 配置设置?

这是我的 Spring Security 上下文片段配置:

  <beans:bean id="saltSource" class="com.myproject.sec.util.MyString" scope="singleton" >
      <beans:constructor-arg value="12345" />
  </beans:bean>

  <authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userService">
        <password-encoder hash="md5">
            <salt-source ref="saltSource" />
        </password-encoder>
    </authentication-provider> 
  </authentication-manager>

...但是这个配置抛出了一个不需要的错误异常抱怨盐源不是 org.springframework.security.authentication.dao.SaltSource 接口,但我不想使用用户详细信息的属性作为我的盐(因为这个接口支持用户详细信息),而是我的自定义字符串对象,如上所示。我该如何做到这一点?

另外,作为第二个密切相关的问题,我知道我可以像这样将 Salt 作为用户名:

  <authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userService">
        <password-encoder hash="md5">
            <salt-source user-property="username"/>
        </password-encoder>
    </authentication-provider> 
  </authentication-manager>

并且,有一个系统范围的固定盐“12345”,如下所示:

  <authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userService">
        <password-encoder hash="md5">
            <salt-source system-wide="12345"/>
        </password-encoder>
    </authentication-provider> 
  </authentication-manager>

...但是我如何将 Salt 作为用户名和系统范围常量“12345”的串联,例如,如果用户名是 fred,则将 Salt 设置为“fred12345”而不诉诸于重写来实现我自己的编码?

4

3 回答 3

2

如果你想让 salt 成为用户名 +“12345”,你可以实现自己的 SaltSource(很简单):

public class UserNameAndStringSalt implements SaltSource {
    @Override
    public Object getSalt(UserDetails user) {
        return user.getUsername() + "12345";                
    }
}

接着:

<beans:bean id="saltSource" class="com.myproject.UserNameAndStringSalt" scope="singleton" />

<authentication-manager alias="authenticationManager">
  <authentication-provider user-service-ref="userService">
      <password-encoder hash="md5">
          <salt-source ref="saltSource" />
      </password-encoder>
  </authentication-provider> 
</authentication-manager>

正如 Neil McGuigan 在上面的回答中所说,尽量不要使用 MD5 或单通道 SHA - 最好使用 BCrypt 或 SCrypt,原因如下:https ://security.stackexchange.com/questions/8607/how-quickly-这些密码方案真的可以被打败吗

于 2013-10-03T17:30:10.557 回答
2

请不要使用 MD5 对密码进行哈希处理,它很容易被破解。

使用 Spring Security 的新 BCryptPasswordEncoder。它为您处理加盐(并将哈希和盐存储在同一个数据库列中):

http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder.html

这是我对简单方法的回答:

具有角色和权限的 Spring Security

于 2013-10-02T23:25:15.417 回答
0

推荐使用 Spring Security 提供的 StandardPasswordEncoder。它会自动为您处理盐渍。它还使用更强大的 SHA256 哈希。

http://docs.spring.io/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/crypto/password/StandardPasswordEncoder.html

<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userService">
        <password-encoder ref="passwordEncoder" />   
    </authentication-provider>
</authentication-manager>
于 2013-10-03T18:03:39.017 回答