Spring Boot 密码 bcrypt 编码器:编码值与在线生成的不匹配

Posted

技术标签:

【中文标题】Spring Boot 密码 bcrypt 编码器:编码值与在线生成的不匹配【英文标题】:Spring Boot password bcrypt encoder: encoded value doesn't match with the online generated one 【发布时间】:2020-01-07 16:05:19 【问题描述】:

在 Spring Boot 2 项目中,我使用 bcrypt 密码编码器根据 LDAP 目录对用户进行身份验证。密码存储在 LDIF 文件中,因此以散列形式存储在目录中,使用 bcrypt。为了确定我需要存储在 LDIF 文件中的每个密码的哈希值,以便加载到目录中,我使用了这个生成器:https://bcrypt-generator.com。

因此,我为用户密码生成哈希值,并将生成的值存储在 LDIF 文件中。然后,我尝试使用 Spring LDAP 密码比较执行身份验证。但是身份验证失败,因为 Spring 和提到的站点为相同的密码计算了不同的 bcrypt 哈希。

当然,使用 Spring encode() 函数计算的哈希值是有效的。所以我的问题是:

    为什么使用相同的算法、相同的输入值和相同的参数,两个本应等效的实现却提供不同的结果? 应该如何生成哈希值,因为 Spring 似乎没有提供任何生成器,并且公共生成器生成的值与 Spring 计算的值不匹配?

非常感谢。

尼古拉斯

【问题讨论】:

LDAP“比较”操作不起作用,因为它需要完全匹配并且(如您所见)bcrypt 每次都会使用不同的盐并产生不同的哈希值。我认为您的 LDAP 服务器需要原生支持 bcrypt 哈希以用于“绑定”身份验证。 【参考方案1】:

为什么使用相同的算法、相同的输入值和相同的参数,两个本应等效的实现却提供不同的结果?

bcrypt 为相同的输入产生不同的输出是正常的(例如,参见https://***.com/a/8467877/1384297),因此可以预期不同的哈希值。

既然 Spring 似乎没有提供任何生成器,应该如何生成哈希值

Spring Boot 的 CLI 包含一个 encodepassword 命令,可用于生成 bcrypt 编码的密码:

$ spring encodepassword secret
bcrypt$2a$10$bhY3U6LEvbJ7DdWrcPqBu.vtLFPqDCgDGpTmyWrAVBcMANQzI/4Xy

https://bcrypt-generator.com 报告 $2a$10$bhY3U6LEvbJ7DdWrcPqBu.vtLFPqDCgDGpTmyWrAVBcMANQzI/4Xysecret 的匹配项。

【讨论】:

感谢您的回复。 spring encodepassword 是什么样的命令?应该如何安装它,从哪里安装,等等。在寻找它时,我什么也没找到。亲切的问候,尼古拉斯 这是 Spring Boot 的 CLI 提供的命令。您可以在relevant section of the reference documentation 中了解如何安装 CLI。

以上是关于Spring Boot 密码 bcrypt 编码器:编码值与在线生成的不匹配的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 3.0 中配置 Spring Boot Security 以使用 BCrypt 密码编码

Spring Boot Security:编码密码看起来不像 BCrypt

BCrypt:使用 Spring Security 的空编码密码

spring security 使用 bcrypt 算法对密码进行编码

使用 OAuth2 和 JWT 的 Spring Security:编码密码看起来不像 BCrypt

使用Spring Security为实时Grails应用程序增加BCrypt logrounds而不重新编码所有密码是否安全?