为什么``PasswordEncoder``实现使用SpringSecurity5.x中的硬编码UTF-8作为输入?
我刚刚在SpringSecurity5.x中偶然发现了一个意想不到的行为:提供的为什么``PasswordEncoder``实现使用SpringSecurity5.x中的硬编码UTF-8作为输入?,spring,spring-boot,spring-security,utf-8,character-encoding,Spring,Spring Boot,Spring Security,Utf 8,Character Encoding,我刚刚在SpringSecurity5.x中偶然发现了一个意想不到的行为:提供的PasswordEncoder实现使用UTF-8编码来对数据进行硬编码散列(示例:,)。因此,既没有办法注入另一种编码,也没有办法以任何方式配置这种行为 现在我很想知道,为什么会做出这样的设计决定?(我毫不怀疑,这是一个意义深远的决定;无论如何,我们都在谈论春天!) 我没有在他们的官员身上发现任何东西,他们也没有在他们的内部说些什么。老实说,我希望能找到更多关于这个设计决策的信息。如果不是作为理由,那么至少要有一份关
PasswordEncoder
实现使用UTF-8编码来对数据进行硬编码散列(示例:,)。因此,既没有办法注入另一种编码,也没有办法以任何方式配置这种行为
现在我很想知道,为什么会做出这样的设计决定?(我毫不怀疑,这是一个意义深远的决定;无论如何,我们都在谈论春天!)
我没有在他们的官员身上发现任何东西,他们也没有在他们的内部说些什么。老实说,我希望能找到更多关于这个设计决策的信息。如果不是作为理由,那么至少要有一份关于这个事实的明确文件。(搜索当然有点困难,因为在处理哈希的编码问题时,我们会遇到语义冲突……也许我真的忽略了它?)
我最初的问题是,我必须处理一个遗留系统,在这个系统中,密码散列是使用ISO-8859-1 CP-1252编码创建的,作为散列的基础,因此我的Spring Boot 2应用程序中的匹配失败。当然,我可以通过改变遗留系统来解决这个问题-我很幸运,我不必首先维护遗留应用程序,我应该注意,推测性问题可能很难回答。尽管我经常致力于春季安全项目,但我的想法并不正式,我请大家对我的话持保留态度 这个问题“为什么X开源项目还没有公开Y的东西?”基本上可以归结为以下几点:
- 编程实践非常普遍,添加一个钩子来偏离它可能会让用户感到困惑而不是帮助
- 添加的任何钩子都是永久维护的钩子。弃用周期很长
- 用户已经有了一个简单的选择
- 公开钩子将与代码中的类似位置不一致
- 偏离编程实践是不安全的/糟糕的实践/等等,因此维护人员希望确保直接覆盖,但不一定只是开关翻转
MessageDigestPasswordEncoder
已被@弃用
这一事实,这意味着添加的理由必须非常充分
由于还没有强有力的证据,该特征并不存在。这对于MessageDigestPasswordEncoder
的任何其他不可配置的方面也是如此(如最终编码的格式)
与此相反,@jb nizet指出,使用密码编码器API迁移密码非常简单。或者,如果这对你不起作用,那么与团队一起,我们来看看 一个很好的理由是UTF8支持用户可能选择在其密码中使用的任何Unicode字符,而ISO-8859-1只支持非常短的列表(拉丁字符)。因此,使用UTF-8可以使其适用于任何语言的任何密码,而ISO-8859-1将为所有使用非拉丁字符的密码生成相同的字节序列,这使得它非常不安全。@jb nizet:我完全知道,UTF-8打开了字符范围。因此,这当然是一个非常好的违约。但是为什么要硬编码?好吧,你可以提供你自己的密码编码器,不是吗?@UChef我找不到更好的参考::规范被修改为指定在散列字符串时:-字符串必须是UTF-8编码的。@UChef我认为对于Digist,规范也需要UTF-8,请参阅。