Spring安全或BCrypt算法哪个对项目这样的帐户有好处?

时间:2014-06-03 03:22:12

标签: java algorithm spring-mvc

我使用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算法。你对这两个方面的反馈是什么?任何推荐?

2 个答案:

答案 0 :(得分:2)

这是一个有趣的问题,事实上有两个问题,因为Spring Security 可以使用BCrypt来获取密码。那么你做了多久:

  • 您要求用户仅为/ welcome *
  • 等网址设置ROLE_USER
  • 用户可以使用BASIC身份验证进行身份验证(您注意到了吗?)。如果未经过身份验证,当他要求“/ welcome *”时,他将被要求在页面/登录时识别
  • 您的用户数据库在您的配置文件中是硬编码的 - 对于演示或非常简单的应用程序可以,但您应该考虑使用DAO或Ldap UserDetailsService实现
  • 你使用ShaPasswordEncoder - 提取表单SpringSecurity参考手册: Spring Security 3.1的crypto包引入了一个更简单的API,它鼓励密码散列的最佳实践。我们建议您将这些API用于新开发,并将org.springframework.security.authentication.encoding包中的类视为旧版实现。可以使用新的或旧的PasswordEncoder类型注入DaoAuthenticationProvider。 - 这个新的加密模块使用多个sha传递建议StandardPasswordEncoder,或者如果您需要基于BCrypt的实现

我的评论:

  • 使用BCrypt与否的选择确实属于你,因为BCrypt被认为更能抵御暴力攻击,但消耗的资源更多。
  • 您只保护/ welcome *'网址。更常见的是保护所有内容,或者至少保护一个受保护的“目录”/protected/**,并对不应该使用的内容使用异常。如果你以后添加另一个URL,默认情况下会受到保护,这在你的配置中不是这样 - 恕我直言,这是你配置中最严重的问题
  • 对于实际应用程序,您应该考虑使用基于DAO或Ldap的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");
    .
    .
    .
}