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

时间:2019-03-22 03:55:31

标签: java spring bcrypt

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

代码段:

screw.ingredients.all()
>>> <QuerySet [<Product: iron_rod>]>
screw.ingredients.all()[0].amount
>>> Traceback (most recent call last):
>>>     File "<input>", line 1, in <module>
>>>     AttributeError: 'Product' object has no attribute 'amount'

3 个答案:

答案 0 :(得分:1)

很难做到。我过去解决此问题的方法是为changePassword场景提供一种非常特定的方法。一旦在特定的代码段中解决了该问题,就永远不会使用常规保存来更新密码。

答案 1 :(得分:0)

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

因此,如果您的字符串以$2开头,后跟ab(通常可以忽略其他情况),则另外一个$是两位数的成本参数而另外一个$则可能是bcrypt哈希。当然,bcrypt散列在许多系统上也将是有效的纯文本密码,但这是一个不太可能的选择(您总是可以拒绝这种格式的密码)。

从您的问题中也不清楚此值是否总是来自客户端-尽管客户端不应将bcrypt哈希发布到服务器。

答案 2 :(得分:0)

根据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.
}