如何在java中检查密码是否为BCrypt编码
我得到一个用户对象绑定到一个Spring控制器的POST请求中。在该对象中有一个密码字段。我不想检查该字段的BCrypt是否已编码,因为save和update两个事件都映射到同一个控制器。你知道这怎么可能吗 代码段:如何在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
@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.
}
没有即时通讯试图确定这是一个保存还是更新使用密码文件。