Yii2密码验证正则表达式

Posted

技术标签:

【中文标题】Yii2密码验证正则表达式【英文标题】:Yii2 password validation regular expression 【发布时间】:2021-06-29 21:08:00 【问题描述】:

这是Yii2密码哈希验证部分原代码。

if (!preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]22/', $hash, $matches)
         || $matches[1] < 4
         || $matches[1] > 30
     ) 
         throw new InvalidArgumentException('Hash is invalid.');

例如密码:12345678 密码哈希:$2y$13$JLD4tOba6KmwkXZFeRB9FufjVTQlmjmQkjwRzAR59/Rp1RK4bF7dO

对于我的项目,根据客户要求,我通过 sha256 对密码进行哈希处理。 例如密码:12345678 密码哈希:ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f 谁能给我提供哈希验证的正则表达式代码?

【问题讨论】:

~^\$2[axy]\$(\d\d)\$[./\dA-Za-z]22,$~ 应该适合您。请澄清什么不起作用 谢谢。变量 $matches 呢? 这将使用捕获 grup 填充,因此对于提供的示例 $matches[1]` 将等于 13 【参考方案1】:

SHA256 哈希是 256 位长。如果写成16进制字符串可以用1个char表示4位,所以结果是64char长的字符串,正则表达式可以是这样的:

/[a-fA-F0-9]64/

SHA256 哈希中没有特殊含义的字符。

顺便说一句。 SHA256 算法不是为加密/散列密码而设计的,因此以这种方式使用它不是一个好主意。主要问题是用这种算法计算哈希值很便宜,这意味着蛮力或字典攻击很快就会通过可能的密码。您应该考虑向您的客户解释这一点,并尽可能说服他使用为密码散列设计的算法。

【讨论】:

这是对他们的要求。不能改变它。当用户登录时,我们将在密码哈希前添加一个随机盐并再次对其进行哈希处理。每次同一个用户登录时,都会在他的密码哈希前添加一个不同的盐,该盐将与密码哈希进行比较,密码哈希将再次与存储在数据库中的随机盐进行哈希。 这还不够。如果数据库被泄露,有人可能会使用存储在那里的盐和哈希来尝试字典/暴力攻击来获取密码。他们可以尝试在其他地方使用电子邮件/密码组合。并非每个人都会听取安全建议并为每个站点使用不同的密码。但我明白,当它是客户的要求时,您可能无法更改它。

以上是关于Yii2密码验证正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式验证密码必须由大小写字母、数字、特殊字符组成

java中的正则表达式问题 怎么验证密码必须由字母 数字或下划线开头,密码可以随便组合

js如何正则验证密码

JAVA正则验证[密码]。验证规则:[5-20位字符,英文,数字或各种符号,不能存在单一形式]。 答案如下:

用于密码验证的正则表达式 Java

具有特殊字符的Javascript正则表达式密码验证