正则表达式找到bcrypt哈希?

Jim*_*Jim 15 regex hash

我希望在数据库中使用regex(在PowerGrep中)找到bcrypt哈希字符串.

试过这个正则表达式:

{?A-Za-z_0-9.{60}}?
Run Code Online (Sandbox Code Playgroud)

但没有找到匹配.Bcrypt哈希长度为60个字符,以"$ 2y $"开头.

例:

$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6
Run Code Online (Sandbox Code Playgroud)

小智 23

正如@stribizhev上面的答案的补充.你可能在野外遇到的bcrypt哈希有几个变种,所以你可能需要修改正则表达式以捕获所有这些哈希.变化如下:

散列的"算法标识符"部分可以包括:

  • "2" - BCrypt的第一次修订版,它存在轻微的安全漏洞,通常不再使用.

  • "2a" - 一些实现遭受了非常罕见的安全漏洞.

  • "2y" - 特定于crypt_blowfish BCrypt实现的格式,除了名称以外的所有格式都与"2a"相同.

  • "2b" - 官方BCrypt算法的最新版本

^\$2[ayb]\$.{56}$
Run Code Online (Sandbox Code Playgroud)

似乎对我有用

请参阅此处了解bcrypt哈希的细分:有人可以解释BCrypt如何验证哈希?

  • 我已经更新你的正则表达式更精确:`^\$ 2 [ayb]\$ [0-9] {2}\$ [A-Za-z0-9 \.\ /] {53} $` .这将检查版本标识符之后的成本值,并优化salt和hash位的字符类.根据你的解释器,你可能不需要逃避正则表达式中的`/`.对于成本值,这只是检查格式,而不是值是否有效(有效值为4-31,包括在内). (3认同)

Wik*_*żew 9

更新:

由于旁边的y值有可能是a或者b,你可以使用

^\$2[ayb]\$.{56}$
Run Code Online (Sandbox Code Playgroud)

在线查看正则表达式演示.细节:

  • ^ - 开始一个字符串
  • \$- 一个文字$字符(它应该以正则表达式模式转义以匹配文字$字符,否则,它将表示字符串的结尾)
  • 2- 一个2
  • [ayb]- 匹配指定集合中任何单个char 的字符类
  • \$- 一个$
  • .{56}-任何比换行符字符其他56个字符(如果不是符合POSIX正则表达式引擎被使用,否则,它将匹配任何字符;以匹配在共同NFA引擎任何字符,替换.[\s\S]或使用对应的DOTALL标志)
  • $ - 字符串结尾.

原始答案

你的正则表达式 - {?A-Za-z_0-9.{60}}?包含不在字符类[...]中但在可选花括号内的范围,因此它们呈现文字字符序列.看看你的正则表达式演示,看看我的意思.

您可以使用以下正则表达式:

^\$2y\$.{56}$
Run Code Online (Sandbox Code Playgroud)

演示

^场比赛字符串的开头,\$2y\$匹配$2y$字面上(作为$是一个特殊字符,需要转义),并.{56}在其余的56个字符.


d4n*_*yll 6

用这个:

^\$2[aby]?\$\d{1,2}\$[.\/A-Za-z0-9]{53}$
Run Code Online (Sandbox Code Playgroud)

说明:

  • \$2[aby]?\$-匹配使用的算法。有效值为2、2a,2y和2b
  • \d{1,2}\$ -与费用或轮数匹配,为4到31(含)之间的整数
  • [.\/A-Za-z0-9]{53} -匹配盐和哈希,盐组成前22个字符,哈希密码组成后31个字符