如何在java中检查密码是否为BCrypt编码

如何在java中检查密码是否为BCrypt编码,java,spring,bcrypt,Java,Spring,Bcrypt,我得到一个用户对象绑定到一个Spring控制器的POST请求中。在该对象中有一个密码字段。我不想检查该字段的BCrypt是否已编码,因为save和update两个事件都映射到同一个控制器。你知道这怎么可能吗 代码段: @RequestMapping(value = "/save", method = RequestMethod.POST) public String saveUser(Model model, @Validated @ModelAttribute("user") SystemUs

我得到一个用户对象绑定到一个Spring控制器的POST请求中。在该对象中有一个密码字段。我不想检查该字段的BCrypt是否已编码,因为save和update两个事件都映射到同一个控制器。你知道这怎么可能吗

代码段:

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveUser(Model model, @Validated @ModelAttribute("user") SystemUser user, BindingResult result) {

}

这很难做到。我过去解决这个问题的方法是为
changePassword
场景提供一个非常具体的方法。一旦在一段特定的代码中解决了这一问题,密码就永远不会通过定期保存进行更新。

不太清楚您在问什么,但您可以相对轻松地检查字符串是否“看起来”像bcrypt密码,因为它们具有独特的格式(例如,
$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i

因此,如果字符串以
$2
开头,后跟
a
b
(通常可以忽略其他情况)、另一个
$
、一个两位数的成本参数和另一个
$
,那么它很可能是一个bcrypt哈希。当然,bcrypt哈希在许多系统上也将是有效的明文密码,但这是一个不太可能的选择(您总是可以拒绝使用这种格式的密码)


您的问题还不清楚此值是否总是来自客户端-但是客户端不应该向服务器发送bcrypt哈希。

根据Spring的BCryptPasswordEncoder类,您可以检查字符串是否使用此正则表达式模式编码

Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");

if (BCRYPT_PATTERN.matcher(stringToCheck).matches()) {
    // stringToCheck is an encoded bcrypt password.
}

没有即时通讯试图确定这是一个保存还是更新使用密码文件。