Spring Security Basic Auth with digest over http for stateless APIs

Posted

技术标签:

【中文标题】Spring Security Basic Auth with digest over http for stateless APIs【英文标题】: 【发布时间】:2020-08-09 10:39:47 【问题描述】:

一些客户/客户会通过用户管理系统将网络应用程序用于离线大规模用途。在这方面,它们为部署具有 HTTPS 支持的应用程序提供了真正的痛苦。让客户抱怨的浏览器对自签名证书发出的 UN-trust 警告别管了。

在这个用例中,为了争论。通过 HTTP 使用安全用户身份验证的选项有哪些?

我一直在尝试使用 Spring Security 和 Spring Boot 来使用基本身份验证保护无状态 API,但我想控制 base64 标头加密/解密,避免以非常容易解密的 base64 字符串发送凭据。

@Override
    protected void configure(HttpSecurity http) throws Exception 
      http.csrf()
          .disable()
          .cors()
          .and()
          .authorizeRequests()
          .antMatchers("/login")
          .permitAll()
          .and()
          .httpBasic();
    

此方法配置扩展WebSecurityConfigurerAdapter。我试图查看BasicAuthenticationFilter 的源代码,发现它使用BasicAuthenticationConverter 创建新对象,所以我无法提供自定义转换器作为bean 来控制base64 解密与更强大的替代(或额外一)。

这也违反了基本身份验证标准。 Digest Auth 将密码存储为文本,这对我来说不是一个选项。

所以,

有没有办法使用带有 HTTP 的 Basic Auth 来控制 base64 解密,试图达到 HTTPS 提供的功能?

或者使用 Digest Auth 和加密的存储密码?

【问题讨论】:

【参考方案1】:

除了使用 HTTPs 之外别无选择,但要回答您的问题,是的,您可以自行控制发送加密数据并创建一个 servlet 过滤器,以便在每个请求或敏感请求上解密发送的数据。

【讨论】:

【参考方案2】:

有没有办法使用带有 HTTP 的 Basic Auth 来控制 base64 解密,试图达到 HTTPS 提供的功能?

是的。这里以基本认证为例进行扩展。您需要根据您的请求创建过滤器,以使用标题中的base64 编码执行任何您想做的事情。您可以在编码为 base64 之前加密包含 username:password 值的 Authorizaion 标头。

用户名:密码>>加密>>编码为base64

然后在该过滤器中,您进行解密并重新创建 base64 纯格式

请求头授权加密>>从base64解码>>解密>>将用户名:密码编码为base64>>继续过滤链到BasicAuthenticationFilter

你可以在 BasicAuthenticationFilter 之前添加过滤器

http.addFilterBefore(tokenFilter(), BasicAuthenticationFilter.class);

请注意,这是扩展基本身份验证的自定义解决方法,但它不是处理基本身份验证的标准方法。

或者使用 Digest Auth 和加密的存储密码?

Digest Auth 通过 HTTP 没有那么安全,但为了更好地了解它的工作原理,您可以看看这个答案

Concept of Digest authentication - does it really work?

使用第一个选项比使用第二个选项更安全。但最好的解决方案是使用 HTTPs。安全性是主要问题和主题,您应该花一些时间尝试找出最适合您的情况的方法。

【讨论】:

以上是关于Spring Security Basic Auth with digest over http for stateless APIs的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 配置:Basic Auth + Spring Cloud Gateway

Spring Security应用开发(04)HTTP basic认证

为啥 Spring boot Security Basic Authentication 慢?

Spring boot security rest basic Authentication example

spring-boot Actuator 连同 Spring Security 和 Form Basic Auth

Spring security Basic Authentication - 401 Unauthorized with correct credentials