Regex 要查找bcrypt哈希的正则表达式?
我希望在数据库中使用regex(在PowerGrep中)查找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
{?A-Za-z_0-9.{60}}?
但没有找到匹配项。Bcrypt哈希长度为60个字符,以“$2y$”开头
例如:
$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6
更新: 由于在
y
值旁边可能有a
或b
,因此您可以使用
^\$2[ayb]\$.{56}$
看详细信息:
-字符串的开头^
-一个literal\$
字符(它应该在正则表达式模式中转义以匹配literal$
字符,否则,它将表示字符串的结尾)$
-a2
char2
-与指定集合中的任何单个字符匹配的字符[ayb]
-a\$
字符$
-除换行符以外的任何56个字符(如果未使用符合POSIX的正则表达式引擎,则它将匹配任何字符;要匹配普通NFA引擎中的任何字符,请将{56}
替换为
或使用相应的[\s\s]
标志)DOTALL
-字符串结束$
{A-Za-z_0-9.{60}}
-包含的范围不在字符类[…]
内,而是在可选的花括号内,因此它们表示文字字符序列。看看我的意思
您可以使用以下正则表达式:
^\$2y\$.{56}$
看
^
匹配字符串的开头,\$2y\$
按字面意思匹配$2y$
(因为$
是一个特殊字符,需要转义),{56}
是其余56个字符。只是对@stribizev上面答案的补充。您可能在野外遇到的bcrypt散列有几个变种,因此您可能需要修改正则表达式以捕获所有变种。变化如下:
散列的“算法标识符”部分可以包括:
-BCrypt的第一个版本,存在一个小的安全漏洞,通常不再使用“2”
-一些实现存在非常罕见的安全漏洞“2a”
-特定于crypt_河豚BCrypt实现的格式,除名称外与“2a”完全相同“2y”
-官方BCrypt算法的最新版本“2b”
^\$2[ayb]\$。{56}$
似乎对我有用
有关bcrypt哈希的详细信息,请参见此处:使用以下命令:
^\$2[aby]?\$\d{1,2}\$[.\/A-Za-z0-9]{53}$
说明:
-与使用的算法匹配。有效值为2、2a、2y和2b\$2[aby]?\$
-匹配成本或多少轮,这是一个介于4和31之间的整数(包括4和31)\d{1,2}\$
-匹配salt和哈希,salt包含前22个字符,哈希密码包含后31个字符[.\/A-Za-z0-9]{53}
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
Alg Cost Salt Hash
其中,每个段的有效值为:
- Alg:
,2
,2a
,2b
或2x
2y
- 成本:4-31(零填充到2位)
- 盐:
x22/0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz
- 哈希:
x 31/0123456789abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz
^[$]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]?\$…