使用Spring Security,BCrypt和Spring Data Rest进行摘要式身份验证

时间:2016-07-07 12:38:43

标签: spring spring-security spring-boot spring-data-rest

我已经在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密码它可以工作,但这不是很可选。 有没有办法让它在不使用客户端的盐渍密码的情况下工作?

1 个答案:

答案 0 :(得分:1)

BCrypt不能使用摘要式身份验证,事实上,摘要式身份验证必须以纯文本格式访问密码(因此您必须以纯文本格式保存或使用可逆算法(如Base64,MD5等)对其进行编码,BCrypt无法逆转,因为它更安全。春季安全文档声明:

  

如果DigestAuthenticationFilter.passwordAlreadyEncoded设置为true,则可以使用HEX(MD5(用户名:realm:密码))格式对密码进行编码。但是,其他密码编码不适用于摘要式身份验证。