【发布时间】:2021-02-24 01:26:26
【问题描述】:
我正在寻找在数据库中使用正则表达式(在 PowerGrep 中)的 bcrypt 哈希字符串。
试过这个正则表达式:
{?A-Za-z_0-9.{60}}?
但没有找到匹配项。 Bcrypt hash 长度为 60 个字符,以 "$2y$" 开头。
例子:
$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6
【问题讨论】:
我正在寻找在数据库中使用正则表达式(在 PowerGrep 中)的 bcrypt 哈希字符串。
试过这个正则表达式:
{?A-Za-z_0-9.{60}}?
但没有找到匹配项。 Bcrypt hash 长度为 60 个字符,以 "$2y$" 开头。
例子:
$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6
【问题讨论】:
就像@stribizhev 对上述答案的补充。您可能会在野外遇到的 bcrypt 哈希有几种类型,因此您可能必须修改正则表达式才能捕获所有这些哈希。变化如下:
哈希的“算法标识符”部分可能包括:
"2" - BCrypt 的第一个版本,存在轻微的安全漏洞,一般不再使用。
"2a" - 一些实现存在非常罕见的安全漏洞。
"2y" - crypt_blowfish BCrypt 实现特有的格式,除名称外与“2a”相同。
"2b" - 官方 BCrypt 算法的最新版本
^\$2[ayb]\$.{56}$
似乎对我有用
请参阅此处了解 bcrypt 哈希的细分:Can someone explain how BCrypt verifies a hash?
【讨论】:
^\$2[ayb]\$[0-9]{2}\$[A-Za-z0-9\.\/]{53}$。这会检查版本标识符之后的成本值,并为 salt 和 hash 位细化字符类。根据您的解释器,您可能不需要在正则表达式中转义 /。对于成本值,这只是检查格式,而不是值是否有效(有效值为 4-31,包括 4-31)。
^\$2[ayb]\$.+$ 的正则表达式可能更合适。
^\$2[ayb]?\$...
更新:
由于y 值旁边可能有a 或b,您可以使用
^\$2[ayb]\$.{56}$
请参阅regex demo online。 详情:
^ - 字符串的开头\$ - 文字 $ 字符(它应该以正则表达式模式转义以匹配文字 $ 字符,否则,它将表示字符串的结尾)2 - 一个 2 字符[ayb] - 一个 character class 匹配指定集合中的任何单个字符\$ - 一个 $ 字符.{56} - 除换行符以外的任何 56 个字符(如果不使用符合 POSIX 的正则表达式引擎,否则,它将匹配任何字符;要匹配常见 NFA 引擎中的任何字符,请将 . 替换为 [\s\S] 或使用对应DOTALL标志)$ - 字符串结束。原答案
您的正则表达式 - {?A-Za-z_0-9.{60}}? - 包含的范围不在字符类 [...] 内,而是在可选的大括号内,因此它们呈现文字字符序列。请参阅your regex demo 了解我的意思。
您可以使用以下正则表达式:
^\$2y\$.{56}$
见demo
^ 匹配字符串的开头,\$2y\$ 匹配 $2y$ 字面意思(因为$ 是一个特殊字符,需要转义),.{56} 是其余 56 个字符。
【讨论】:
使用这个:
^\$2[aby]?\$\d{1,2}\$[.\/A-Za-z0-9]{53}$
解释:
\$2[aby]?\$ - 匹配使用的算法。有效值为 2、2a、2y 和 2b\d{1,2}\$ - 匹配成本,或轮数,是 4 到 31(含)之间的整数[.\/A-Za-z0-9]{53} - 匹配盐和哈希,盐构成前 22 个字符,散列密码构成最后 31 个字符【讨论】:
根据 Wikipedia,bcrypt 哈希遵循以下格式:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
Alg Cost Salt Hash
每个段的有效值是:
2、2a、2b、2x 或 2y
./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ x 22./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ x 31因此,一个综合的正则表达式应该如下所示:
^[$]2[abxy]?[$](?:0[4-9]|[12][0-9]|3[01])[$][./0-9a-zA-Z]{53}$
【讨论】: