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