[spring-projects/spring-boot]向 Spring CLI 添加对密码编码的支持

2024-04-29 46 views
8

Spring Boot 提供了使用 Spring 环境外部化用户密码的能力。然而,用户没有一种简单的方法来对密码进行编码以保证其安全。

如果 Spring CLI 提供一个用于对密码进行编码的命令,那就太好了。这将需要一个依赖项,spring-security-crypto该依赖项仅具有依赖项spring-jcl和可选依赖项org.bouncycastle:bcpkix-jdk15on

回答

6

顺便说一句,spring cloud cli 提供了类似的功能。

4

我和罗布就此事进行了简短的通话。尽管我们一直在努力淡化 Spring CLI,但我认为这实际上是有意义的。

我们讨论的选项是:

  • 在线工具 - 很糟糕,因为你要发送密码
  • spring-crypto jar 中的一个 main 方法 - 很糟糕,因为它会扰乱 Boot 中的 main 方法检测,并且您需要以某种方式下载 jar
  • Spring Security 发布的一款专用工具 - 很糟糕,因为用户还需要进行一次brew/install 操作
  • CLI 扩展 - 还不错,但是 Spring Security 需要发布另一个 JAR 并且用户需要这样做$ spring install org.springframework.security:spring-security-cli:1.2.3.RELEASE

由于 Boot 支持属性中的密码,因此提供一个允许您生成密码的工具对我来说很有意义。

8

标记以引起团队注意,以防有人强烈认为添加到 CLI 会成为一个问题。

9

FWIW,我认为这也有道理。

3

@rwinch 我添加了对此的支持。我唯一不确定的是我们是否应该{alg}在结果中包含前缀。目前还没有。

你可以这样做spring encodepassword mysecret,它会吐出编码版本。spring encodepassword -a pbkdf2 mysecret如果您想使用不同的算法,您也可以这样做。目前只有 pbkdf2 和 bcrypt 似乎是明智的。其他的要么已弃用,要么需要充气城堡。

2

@philwebb 感谢您的快速周转。我认为支持PasswordEncoderFactories.createDelegatingPasswordEncoeder()并将其设为默认值是有意义的。这将确保{alg}自动添加并且默认编码与 Spring Security 的默认编码相匹配。除此之外,我同意并认为这一点bcryptpbkdf2我们应该支持的其他算法一样有意义。想法?

2

@rwinch 我看过,PasswordEncoderFactories但我认为我不能真正使用它。该DelegatingPasswordEncoder.encode方法始终使用默认值,因此无法指定算法。

0

@spencergibb 他们不是为了不同的事情吗?这是用于单向密码哈希生成的。而且前缀也不会真正起作用,不是吗?

6

@philwebb 谢谢,是的,他们是不同的,很抱歉造成误解。

7

@philwebb

我查看了PasswordEncoderFactories,但我认为我不能真正使用它。 DelegatingPasswordEncoder.encode 方法始终使用默认值,因此无法指定算法。

我不确定我是否理解这个问题。

现在EncodePasswordCommand 委托BCryptPasswordEncoderPbkdf2PasswordEncoder。如果不使用算法,是否可以将其更新为使用默认值。例如:

encoders.put("bcrypt", BCryptPasswordEncoder::new);
encoders.put("default", PasswordEncoderFactories::createDelegatingPasswordEncoeder);
encoders.put("pbkdf2", Pbkdf2PasswordEncoder::new);

然后您可以将算法选项的默认值更改为default

5

哦,我明白了,是的,我们可以做到。我以为你的意思是从地图中提取相同的名字,但我们做不到。

2

其实,再想一想,我觉得这并不是一个好主意。默认算法不会添加前缀,我们可能应该始终添加前缀以防止将来默认算法发生任何更改。换句话说,如果您对属性的密码进行编码,您不希望将来的升级突然开始使用不同的算法来检查它。

5

我认为有些混乱。

默认算法不会添加前缀,我们可能应该始终添加前缀以防止将来默认算法发生任何更改。

DelegatingPasswordEncoder.encode会自动添加用于编码的编码器的前缀。这是因为编码方法旨在与其匹配项一起使用。

换句话说,如果您对属性的密码进行编码,您不希望将来的升级突然开始使用不同的算法来检查它。

该前缀不是标准,因此它不能与其他库一起使用。用户可能使用 Spring Security 对密码进行编码,并使用 Ruby 应用程序验证密码。用户明确提供BCryptPasswordEncoder或是完全合理的Pbkdf2PasswordEncoder

由于这些原因,当用户将算法指定为 bcrypt 或 pbkdf2 时,我们不应在输出中为编码密码添加前缀。如果我们这样做,我们实际上是用DelegatingPasswordEncoder+ alg 对其进行编码,这不适用于其他库。提供 alg 时添加前缀可能会让不知道他们选择的 alg 格式是什么的用户感到惊讶。

请务必记住,迁移到使用前缀就像将前缀与哈希密码连接一样简单。由于迁移很简单,因此对于新应用程序来说DelegatingPasswordEncoder,在必要之前坚持使用标准编码(避免使用)可能很有吸引力。这是当用户提供 alg 时我们应该避免为密码添加前缀的另一个原因。

9

啊,我的错误。出于某种原因,我认为DelegatingPasswordEncoder.encode没有添加前缀。