我使用spring security来哈希我的密码。它是安全的,因为我第一次使用spring security。
我的代码
<security:http auto-config="true">
<security:intercept-url pattern="/welcome*" access="ROLE_USER" />
<security:form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/loginfailed" />
<security:logout logout-success-url="/logout" />
</security:http>
authentication-failure-url="/loginfailed" />
<security:logout logout-success-url="/logout" />
</security:http>
<authentication-manager>
<authentication-provider>
<password-encoder hash="sha" />
<user-service>
<user name="k" password="7c4a8d09ca3762af61e59520943dc26494f8941b"
authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
。我曾经使用过bcrypt算法。你对这两个方面的反馈是什么?任何推荐?
答案 0 :(得分:2)
这是一个有趣的问题,事实上有两个问题,因为Spring Security 可以使用BCrypt来获取密码。那么你做了多久:
UserDetailsService
实现ShaPasswordEncoder
- 提取表单SpringSecurity参考手册: Spring Security 3.1的crypto包引入了一个更简单的API,它鼓励密码散列的最佳实践。我们建议您将这些API用于新开发,并将org.springframework.security.authentication.encoding包中的类视为旧版实现。可以使用新的或旧的PasswordEncoder类型注入DaoAuthenticationProvider。 - 这个新的加密模块使用多个sha传递建议StandardPasswordEncoder
,或者如果您需要基于BCrypt的实现我的评论:
/protected/**
,并对不应该使用的内容使用异常。如果你以后添加另一个URL,默认情况下会受到保护,这在你的配置中不是这样 - 恕我直言,这是你配置中最严重的问题UserDetailsService
实现并使用加密模块进行密码编码最后一句话:你写了两次这样的行,所以你的档案坏了: - )
authentication-failure-url="/loginfailed" />
<security:logout logout-success-url="/logout" />
</security:http>
答案 1 :(得分:2)
再加上Serge的回答,
您可以通过声明密码编码器bean来配置您的AuthenticationProvider
以自动使用BCrypt:
<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
然后将对此bean的引用传递到AuthenticationProvider
,如下所示:
<authentication-manager alias="authenticationManager">
<authentication-provider>
<!-- Your actual auth provider here -->
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>
正如Serge所说,BCrypt对于强制密码更加安全,并且作为额外的好处,编码器bean可以@Autowired
进入您的类,因此您可以在创建新用户时以编程方式编码密码。
@Autowired
private BCryptPasswordEncoder encoder;
public void createUser(User user){
user.setPassword(encoder.encode("passwordStringHere");
.
.
.
}