我在所有项目中都使用Spring5。我想为一个端点添加一个只有一个密码/登录名的基本身份验证(请记住,基本身份验证是基于用于对标头进行身份验证的请求” Authorization : Basic ${encryptedInBase64('login:password')}
")
我的问题是,由springweb初始化的基本身份验证对login:secret using base64编码器
但是
spring security不再提出base64密码编码器,“因为加密级别太低”
一个快速的解决办法是
使用不推荐使用的md4passwordencoder,它在base64中编码/解码
实现我自己的“mtbase64passwordencoder”类,他们也这么做。
但他们两个看起来都不干净。
所以我的问题是:在两个spring5项目之间用basic auth连接的干净方法是什么?spring希望我们如何做基本的auth?
2条答案
按热度按时间zqry0prt1#
spring密码编码器api用于在存储到数据库之前对密码进行编码,例如,它与基本身份验证无关!
根据定义,基本身份验证必须使用base64,请参阅rfc 7617。它对用户名和密码使用base64编码。
spring security passwordencoder用于创建一种散列,以便安全地存储,并在以后用于检查密码。结果不能被取消编码以获得原始密码!因此
PasswordEncoder
使用base64是个坏主意,因为您总是可以对内容进行反向解码。从我的观点来看,这个名字
PasswordEncoder
是误导性的,spring团队应该给它命名PasswordHashFunction
或者类似于澄清它的单向功能。如果您使用的是当前的spring安全版本,请注意这两个版本
PasswordEncoder
接口:org.springframework.security.authentication.encoding.PasswordEncoder
已弃用更好地利用
org.springframework.security.crypto.password.PasswordEncoder
.nr7wwzry2#
从“基本认证”rfc(https://www.rfc-editor.org/rfc/rfc7617.txt):
本文档定义了“基本”超文本传输协议(http)身份验证方案,该方案以用户id/密码对的形式传输凭据,并使用base64编码。
用base64编码用户/密码对是标准的。因此,除了离开基本身份验证之外,您不应该使用其他任何东西。
base64也不是“弱的”,因为它不是加密,只是编码。它并不比纯文本好。它仍然需要编码,因为用户名和密码都可能包含http头中不允许的字符。