Spring Bcrypt 是无状态的,不需要安全的随机数?

Spring Bcrypt is stateless and doesn't need a secure random?

我对 Spring 安全 BCrypt 有 两个疑问

  1. Bcrypt 是否需要强度和安全的随机数才能安全?
  2. 在 MySQL(BINARY 与 CHAR)中保存哪种数据类型最好?

关于第一个疑问,我看了很多教程,发现总是一样的配置(默认)

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

那么,我可以认为这个配置是无状态的吗?不需要为我的 Web 服务使用强度和安全随机生成与默认配置不同的哈希值?


关于第二个疑问,Bcrypt 哈希长度是否始终为 60?那么,在我的数据库中使用 CHAR(60) 还是 BINARY(60) 更好?

Spring 安全是开源的。这是 BCryptPasswordEncoder

source code

如果您不传入 SecureRandom,它只会创建一个新的。从安全的角度来看,这很好。出于性能或测试能力的原因,您可以自己传递。

如果您不传入 Strength,它会使用 GENSALT_DEFAULT_LOG2_ROUNDS,即 10,这是相当安全的。为了安心,你可以传入这个值。

Spring 安全的数据库架构建议 varchar(50) 用于 password 列,但看起来 60 是正确的,无论如何 bcrypt。

我会使用 char/varchar 而不是 binary,因为它更易于阅读(视觉上)。