我已经在Spring安全性中实现了摘要式身份验证,它正常工作,直到我将其设置为使用BCrypt进行加密。
@Bean
public DigestAuthenticationEntryPoint digestEntryPoint() {
DigestAuthenticationEntryPoint digestAuthenticationEntryPoint = new DigestAuthenticationEntryPoint();
digestAuthenticationEntryPoint.setKey("myKey");
digestAuthenticationEntryPoint.setRealmName("Digest Realm");
return digestAuthenticationEntryPoint;
}
@Bean
public DigestAuthenticationFilter digestAuthenticationFilter(
DigestAuthenticationEntryPoint digestAuthenticationEntryPoint) {
DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter();
digestAuthenticationFilter.setAuthenticationEntryPoint(digestEntryPoint());
// digestAuthenticationFilter.setPasswordAlreadyEncoded(true);
digestAuthenticationFilter.setUserDetailsService(userDetailsServiceBean());
return digestAuthenticationFilter;
}
这些是我设置的启用摘要的bean,并将它们用于:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.exceptionHandling()
.authenticationEntryPoint(digestEntryPoint())
.and()
.addFilter(digestAuthenticationFilter(digestEntryPoint()))
//.httpBasic()
//.and()
.antMatcher("/**")
.csrf()
.disable()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.deleteCookies("remove")
.invalidateHttpSession(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login")
.permitAll();
}
问题是服务器端生成了MD5响应并且我自己的响应不匹配。 在DigestAuthenticationFilter.java中
if (!serverDigestMd5.equals(digestAuth.getResponse())) {
if (logger.isDebugEnabled()) {
logger.debug("Expected response: '" + serverDigestMd5
+ "' but received: '" + digestAuth.getResponse()
+ "'; is AuthenticationDao returning clear text passwords?");
}
fail(request,
response,
new BadCredentialsException(messages.getMessage(
"DigestAuthenticationFilter.incorrectResponse",
"Incorrect response")));
return;
}
服务器" serverDigestMd5"使用散列密码来创建md5digest,但在客户端(使用邮递员)我使用未加密码的密码,即如何生成响应。如果我在客户端使用salted密码它可以工作,但这不是很可选。 有没有办法让它在不使用客户端的盐渍密码的情况下工作?
答案 0 :(得分:1)
BCrypt不能使用摘要式身份验证,事实上,摘要式身份验证必须以纯文本格式访问密码(因此您必须以纯文本格式保存或使用可逆算法(如Base64,MD5等)对其进行编码,BCrypt无法逆转,因为它更安全。春季安全文档声明:
如果DigestAuthenticationFilter.passwordAlreadyEncoded设置为true,则可以使用HEX(MD5(用户名:realm:密码))格式对密码进行编码。但是,其他密码编码不适用于摘要式身份验证。