【问题标题】:Spring 5 , basic Authentication and base64 password EncoderSpring 5,基本身份验证和base64密码编码器
【发布时间】:2021-03-26 22:47:15
【问题描述】:

我在所有项目中都使用 spring 5。 我想为一个端点添加一个只有一个秘密/登录名的基本身份验证。 (请记住,基本身份验证基于用于验证标头“Authorization : Basic ${encryptedInBase64('login:password')}”的请求)

我的问题是,spring-web 初始化的基本身份验证使用 base64 编码器加密 login:secret

但是

spring security 不再提出base64密码编码器“因为加密级别太低”

快速解决方法是

  1. 使用已弃用的 Md4PasswordEncoder,它在 base64 中编码/解码
  2. 实现我自己的“MtBase64PasswordEncoder”类,谁也这样做。

但它们似乎都不干净。

所以我的问题是:在两个 Spring 5 项目之间建立基本身份验证连接的干净方法是什么? spring 期望我们如何进行基本认证?

【问题讨论】:

    标签: java spring spring-mvc spring-security basic-authentication


    【解决方案1】:

    来自“基本身份验证”RFC (https://www.rfc-editor.org/rfc/rfc7617.txt):

    本文档定义了“基本”超文本传输​​协议 (HTTP) 身份验证方案,将凭据作为用户 ID/ 密码对,使用 Base64 编码。

    使用 Base64 编码用户/密码对是标准。因此,您不应该使用其他任何东西,除了远离基本身份验证。

    Base64 也不是“弱”,因为它不是加密,只是一种编码。它并不比纯文本更好。它仍然需要编码,因为用户名和密码都可能包含 HTTP 标头中不允许的字符。

    【讨论】:

      【解决方案2】:

      Spring 密码编码器 API 旨在用于数据库中的 encode a password before storing,例如它与基本身份验证无关!

      基本身份验证根据定义必须使用 Base64,请参阅RFC 7617。它对用户名密码使用Base64编码。

      Spring Security PasswordEncoder 用于创建一种哈希值,以便安全存储并用于稍后检查密码。结果一定不能能够通过未编码得到原始密码!因此,使用 Base64 的 PasswordEncoder 是个坏主意,因为您始终可以反向解码内容。

      在我看来,PasswordEncoder 的名称具有误导性,Spring 团队应该将其命名为 PasswordHashFunction 或类似名称,以阐明其单向功能。

      如果您使用当前的 Spring Security 版本,请注意两个 PasswordEncoder 接口:

      • org.springframework.security.authentication.encoding.PasswordEncoder 已弃用
      • 更好地使用org.springframework.security.crypto.password.PasswordEncoder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-01
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多