Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么``PasswordEncoder``实现使用SpringSecurity5.x中的硬编码UTF-8作为输入?_Spring_Spring Boot_Spring Security_Utf 8_Character Encoding - Fatal编程技术网

为什么``PasswordEncoder``实现使用SpringSecurity5.x中的硬编码UTF-8作为输入?

为什么``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编码来对数据进行硬编码散列(示例:,)。因此,既没有办法注入另一种编码,也没有办法以任何方式配置这种行为 现在我很想知道,为什么会做出这样的设计决定?(我毫不怀疑,这是一个意义深远的决定;无论如何,我们都在谈论春天!) 我没有在他们的官员身上发现任何东西,他们也没有在他们的内部说些什么。老实说,我希望能找到更多关于这个设计决策的信息。如果不是作为理由,那么至少要有一份关

我刚刚在SpringSecurity5.x中偶然发现了一个意想不到的行为:提供的
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,请参阅。