用正则表达式设计最复杂高强度密码同时要求大小写字母数字和特殊符号?这个可以有!阿里云北京分销中心工程师这次给大家分享验证用户设置的密码强度的正则表达式。 验证用户设置的密码强度有哪些注意事项? 下面是几个不同密码复杂强度的实际案例, 让我们来看看怎么设置史上最复杂密码吧。
本文给出了两种密码强度的正则表达式方案,一种简单,一种更复杂,更安全。 分别给出了两种方案的分析和测试过程。 一般可以根据自己项目的实际需要定义自己的密码常规协议。
当用户注册时,他们将使用常规密码验证。 要编写正确的正则表达式,必须先定义表达式规则。
方案1 (超级简单的密码正则表达式规则)
假设密码验证做如下规则定义:最短6位,最长16位 {6,16}
可以包含小写大母 [a-z] 和大写字母 [A-Z]
可以包含数字 [0-9]
可以包含下划线 [ _ ] 和减号 [ – ]
根据以上规则,很容易给出正则字面量定义如下:var pattern = /^[\w_-]{6,16}$/;
方案1解读:
字面量 / /
正则表达式的字面量定义为包含在一对斜杠(/)之间的字符,例如:var pattern = /s$/;
上述字面量匹配所有以字母“s”结尾的字符串。
字符类 [ ]
将字符放进方括号内就组成了字符类。一个字符类可以匹配它所包含的任意字符。因此,正则表达式 /[abc]/ 就和字母“a”,“b”,“c”中的任意一个都匹配。
字符类可以使用连字符来表示字符范围。要匹配拉丁小写字母可以使用 /[a-z]/ 。
字符类 \w
字符类 \w 匹配任何ASCII字符组成的单词,等价于[a-zA-Z0-9]。
[\w_-] 表示匹配任意的拉丁大小写字母,数字再加上下划线和减号。
重复 {}
在正则表达式中用{ }来表示元素重复出现的次数。{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项n次
[\w_-]{6,16} 表示匹配任意的拉丁大小写字母,数字再加上下划线和减号出现最少6次,最多16次。
匹配位置
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
/^\w/ 匹配以大小写字母或数字开头的字符串。
方案1测试
给出测试结果如下:var pattern = /^[\w_-]{6,16}$/;
pattern.test(‘123456’) = true;
pattern.test(‘-ifat33’) = true;
pattern.test(’42du’) = false;
pattern.test(‘du42du42du42du421’) = false;
pattern.test(’42du42@’) = false;
根据测试结果,可以得出方案一只是对密码进行了简单的限制,并不能保证密码的强度和账户的安全。
方案2 (安全)
假设密码验证做如下规则定义:最短6位,最长16位 {6,16}
必须包含1个数字
必须包含2个小写字母
必须包含2个大写字母
必须包含1个特殊字符
根据以上规则,很容易给出正则字面量定义如下:
var pattern = /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{2,})(?=.*[a-z]{2,})(?=.*[!@#$%^&*?]).*$/;
方案2解读
字符类 .
字符类 . 表示除换行符和其他Unicode行终止符之外的任意字符。
正向先行断言 (?= )
在符号“(?=” 和 “)” 之间加入一个表达式,它就是一个先行断言,用以说明圆括号内的表达式必须正确匹配。比如: /Java(?=\:)/ 只能匹配Java且后面有冒号的。
(?=.*[!@#$%^&*?])
该先行断言表示,必须包括一个特殊字符。上述表达式中的10个特殊字符为键盘1,2…0的上档键字符,也可以添加别的特殊字符。注意:如果添加字符是正则表达式中具有特殊含义的,需要在符号前加反斜线(\)转义。
方案2测试
给出测试结果如下:var pattern = /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{2,})(?=.*[a-z]{2,})(?=.*[!@#$%^&*?]).*$/;
pattern.test(‘du42DU!’) = true;
pattern.test(‘duDUd!’) = false;
pattern.test(’42dud!’) = false;
pattern.test(’42DUD!’) = false;
pattern.test(’42duDU’) = false;
pattern.test(’42duU(‘) = false;
pattern.test(’42dUU!’) = false;
相信你看了这篇文章以后,已经掌握了使用正则表达式设置密码复杂度的方法,这里再送你一盘芝士吧:
正则表达式的字符串模式与字面量模式
字面量模式 | 对应的字符串模式 |
/\.at/ | “\\.at” |
/\[bc\]at/ | “\\[bc\\]at” |
/name\/age/ | “name\\/age” |
/\d.\d{1,2}/ | “\\d.\\d{1,2}” |
/\w\\hello\\123/ | “\\w\\\\hello\\\\123” |