【问题标题】:Regular expression to find bcrypt hash?正则表达式查找bcrypt哈希?
【发布时间】:2021-02-24 01:26:26
【问题描述】:

我正在寻找在数据库中使用正则表达式(在 PowerGrep 中)的 bcrypt 哈希字符串。

试过这个正则表达式:

{?A-Za-z_0-9.{60}}?

但没有找到匹配项。 Bcrypt hash 长度为 60 个字符,以 "$2y$" 开头。

例子:

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

【问题讨论】:

    标签: regex hash


    【解决方案1】:

    就像@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)。
    • 随着时间的推移,如果您使用 php 的新 password_hash 函数进行 bcrypting,长度可能会超过 60。因此,^\$2[ayb]\$.+$ 的正则表达式可能更合适。
    • Rand, [ayb] 应该是可选的以支持最旧的版本:^\$2[ayb]?\$...
    【解决方案2】:

    更新

    由于y 值旁边可能有ab,您可以使用

    ^\$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 个字符。

    【讨论】:

      【解决方案3】:

      使用这个:

      ^\$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 个字符

      【讨论】:

        【解决方案4】:

        根据 Wikipedia,bcrypt 哈希遵循以下格式:

        $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
        \__/\/ \____________________/\_____________________________/
         Alg Cost      Salt                        Hash
        

        每个段的有效值是:

        • 算法:22a2b2x2y
        • 费用:4-31(零填充到 2 位数)
        • 盐:./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ x 22
        • 哈希:./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ x 31

        因此,一个综合的正则表达式应该如下所示:

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

        【讨论】:

          猜你喜欢
          • 2018-01-12
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 2013-05-04
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          相关资源
          最近更新 更多