Regex 要查找bcrypt哈希的正则表达式?

Regex 要查找bcrypt哈希的正则表达式?,regex,hash,Regex,Hash,我希望在数据库中使用regex(在PowerGrep中)查找bcrypt哈希字符串 已尝试此正则表达式: {?A-Za-z_0-9.{60}}? 但没有找到匹配项。Bcrypt哈希长度为60个字符,以“$2y$”开头 例如: $2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6 更新: 由于在y值旁边可能有a或b,因此您可以使用 ^\$2[ayb]\$.{56}$ 看详细信息: ^-字符串的开头 \$-一个literal

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

已尝试此正则表达式:

{?A-Za-z_0-9.{60}}?
但没有找到匹配项。Bcrypt哈希长度为60个字符,以“$2y$”开头

例如:

$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6

更新

由于在
y
值旁边可能有
a
b
,因此您可以使用

^\$2[ayb]\$.{56}$
详细信息

  • ^
    -字符串的开头
  • \$
    -一个literal
    $
    字符(它应该在正则表达式模式中转义以匹配literal
    $
    字符,否则,它将表示字符串的结尾)
  • 2
    -a
    2
    char
  • [ayb]
    -与指定集合中的任何单个字符匹配的字符
  • \$
    -a
    $
    字符
  • {56}
    -除换行符以外的任何56个字符(如果未使用符合POSIX的正则表达式引擎,则它将匹配任何字符;要匹配普通NFA引擎中的任何字符,请将
    替换为
    [\s\s]
    或使用相应的
    DOTALL
    标志)
  • $
    -字符串结束
原始答案

您的正则表达式-
{A-Za-z_0-9.{60}}
-包含的范围不在字符类
[…]
内,而是在可选的花括号内,因此它们表示文字字符序列。看看我的意思

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

^\$2y\$.{56}$


^
匹配字符串的开头,
\$2y\$
按字面意思匹配
$2y$
(因为
$
是一个特殊字符,需要转义),
{56}
是其余56个字符。

只是对@stribizev上面答案的补充。您可能在野外遇到的bcrypt散列有几个变种,因此您可能需要修改正则表达式以捕获所有变种。变化如下:

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

  • “2”
    -BCrypt的第一个版本,存在一个小的安全漏洞,通常不再使用

  • “2a”
    -一些实现存在非常罕见的安全漏洞

  • “2y”
    -特定于crypt_河豚BCrypt实现的格式,除名称外与“2a”完全相同

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

^\$2[ayb]\$。{56}$
似乎对我有用

有关bcrypt哈希的详细信息,请参见此处:

使用以下命令:

^\$2[aby]?\$\d{1,2}\$[.\/A-Za-z0-9]{53}$
说明:

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

根据维基百科,bcrypt哈希遵循以下格式:

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
 Alg Cost      Salt                        Hash
其中,每个段的有效值为:

  • Alg:
    2
    2a
    2b
    2x
    2y
  • 成本:4-31(零填充到2位)
  • 盐:
    /0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz
    x22
  • 哈希:
    /0123456789abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz
    x 31
因此,一个全面的正则表达式应该如下所示:

^[$]2[abxy]?[$](?:0[4-9]|[12][0-9]|3[01])[$][./0-9a-zA-Z]{53}$

我已经更新了您的正则表达式,使其更加精确:
^\$2[ayb]\$[0-9]{2}\$[a-Za-z0-9\.\/]{53}$
。这将检查版本标识符之后的成本值,并细化salt和hash位的字符类。根据您的解释器,您可能不需要转义正则表达式中的
/
。对于成本值,这只是检查格式,而不是检查值是否有效(有效值为4-31,包括4-31)。随着时间的推移,如果使用php的新密码\u散列函数,长度可能会超过60。因此,
^\$2[ayb]\$.+$
的正则表达式可能更合适。Rand,[ayb]应该是可选的,以支持最旧的版本:
^\$2[ayb]?\$…