常用的密码校验
情景一:
要求:
- 密码长度最少8位
- 大写字母,小写字母,数字,特殊符号必须四选三
首先给出全部四种的匹配表达式:[a-zA-Z0-9\W_]{8,}
其中\W
匹配任意不是字母,数字,下划线,汉字的字符。
然后使用排除法,排除其中只选一种或只选两种的情况,剩下的就是选了三种的情况了。
有:
大写+小写,大写+数字,大写+特殊符号,小写+数字,小写+特殊符号,数字+特殊符号。共这6种组合。
最后使用环视-正向否定匹配 (?!...)
组合起来,就得到最终需要的表达式:^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$
const rule = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$/;
if(rule.test(password)){
console.log("密码验证通过");
}else{
console.log("密码验证不通过");
}
情景二:
const passwordRules = {
title: "通行证口令应满足以下要求,否则为弱口令",
icon: "info-circle",
content: [
"1. 通行证账号和口令严禁使用出厂默认的、易被猜测的字符串,如admin,root,123456,111111等;",
"2. 通行证口令长度应至少8位,系统最高权限通行证口令长度至少为12位;",
"3. 通行证口令应包括数字,小写字母,大写字母,特殊符号4类中至少3类;",
"4. 通行证口令应与用户名无相关性,口令不得包含账号完整字符串、大小写变位或形似变换的字符串;",
"5. 通行证口令设置应避免键盘排序密码。",
],
};
/**
* @Author: zdd
* @Date: 2020-07-27 10:45:06
* @LastEditors: zdd
* @description: 描述:密码校验规则
* @param:{password:'密码'}
* @return: Boolean 校验是否通过,true:通过;false:不通过
*/
checkPassword = (password) => {
let returnFlag = false;
const rule = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$/;
if (!rule.test(password)) {
//密码长度和四选择三
returnFlag = false;
} else if (
password === "admin" ||
"root" ||
"huawei" ||
"cisco" ||
"123456" ||
"111111"
) {
//非特殊字符
returnFlag = false;
} else if (password.equalsIgnoreCase(this.state.userName)) {
//用户名和密码无相关性
returnFlag = false;
} else if (!passwordCanotKeyboard(password)) {
// 密码按照键盘排列
returnFlag = false;
} else {
returnFlag = true;
}
return returnFlag
};
注意:passwordCanotKeyboard见:
/**
* @Author: zdd
* @Date: 2020-07-27 11:22:44
* @LastEditors: zdd
* @description: 描述:密码不允许键盘排序密码
* @param :{password:密码}
* @return: Boolean 校验是否通过,true:通过;false:不通过
*/
export default function passwordCanotKeyboard(password) {
let checkData = [
[
`[email protected]#$%^&*()_+`,
`QWERTYUIOP{}`,
`ASDFGHJKL;""`,
`ZXCVBNM<>?`
],
[
"`1234567890-=",
`qwertyuiop[]`,
`asdfghjkl;'`,
`zxcvbnm,./`
]
];
for(let item of checkData){
for(let subItem of item){
if(find(password,subItem)>2){
return false
}
}
}
return true;
}
/**
* @Author: zdd
* @Date: 2020-07-27 14:03:01
* @LastEditors: zdd
* @description: 描述:求两个字符串的最长公共子串;算法:动态规划算法
* @param {type}
* @return: 返回最长公共子串的长度
*/
function find(str1 = "", str2 = "") {
//创建一个二维数组
let temp = new Array()
let max = 0
let index = null
for (let i = 0; i < str1.length; i++) {
//初始化为二维数组
temp[i] = new Array()
for (let j = 0; j < str2.length; j++) {
//比较两个位置是否相等,相等就将让temp[i][j]相对于temp[i-1][j-1]加一(前提是temp[i-1][j-1]存在)
if (str1.charAt(i) === str2.charAt(j)) {
if (i > 0 && j > 0 && temp[i - 1][j - 1] > 0) {
temp[i][j] = 1 + temp[i - 1][j - 1]
} else {
temp[i][j] = 1
}
//保存当前temp中最大的数字,并
if (max < temp[i][j]) {
max = temp[i][j]
index = i
}
} else {
temp[i][j] = 0
}
}
}
return str1.substr(index - max + 1, max).length
}
其它密码校验规则:
密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等
方案一
至少8-16个字符,至少1个大写字母,1个小写字母和1个数字,其他可以是任意字符:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/
或者:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\s\S]{8,16}$/
其中 [\s\S] 中的\s空白符,\S非空白符,所以[\s\S]是任意字符。也可以用 [\d\D]、[\w\W]来表示。
至少8个字符,至少1个大写字母,1个小写字母和1个数字,不能包含特殊字符(非数字字母):
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
至少8个字符,至少1个字母,1个数字和1个特殊字符:
^(?=.*[A-Za-z])(?=.*\d)(?=.*[[email protected]$!%*#?&])[A-Za-z\[email protected]$!%*#?&]{8,}$
至少8个字符,至少1个大写字母,1个小写字母和1个数字:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[email protected]$!%*?&])[A-Za-z\[email protected]$!%*?&]{8,}
最少8个最多十个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[email protected]$!%*?&])[A-Za-z\[email protected]$!%*?&]{8,10}
方案二
还有,你可以使用这个正则表达式:
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#[email protected]$%^&*-]).{8,}$
这个正则表达式将强制执行这些规则:
至少1个大写字母English letter,(?=.*?[A-Z])
至少1个小写英文字母,(?=.*?[a-z])
至少1位数字,(?=.*?[0-9])
至少有1个特殊字符,(?=.*?[#[email protected]$%^&*-])
最小8个长度.{8,}
方案三
正则表达式没有AND运算符,所以编写正则表达式与有效密码匹配是非常困难的,当有效性被某些东西和其他东西等定义时…
但是,正则表达式确实有1个OR运算符,所以只需应用DeMorgan的定理,并编写1个与无效密码相匹配的正则表达式:
任何少于8个字符或任何没有数字或任何没有大写字母或任何没有小写字母或任何没有特殊字符的任何东西。
所以:^(.{0,7}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9]*)$,如果有什么匹配的话,这是1个无效的密码。
方案四
由于特殊字符仅限于键盘中的特殊字符,因此可用于任何特殊字符:
^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$
这个正则表达式将强制执行这些规则:
– 至少1个大写英文字母
– 至少1个小写英文字母
– 至少1位数字
– 至少1个特殊字符
– 最少8个长度
方案五
根据我的情况,我遇到了最受欢迎的答案。例如,我的验证失败,其中包含;或[等字符。我对 white-listing 我的特殊字符不感兴趣,所以我用[^\w\s]作为测试 – 简单地把非字符(包括数字)和非空格字符放在一起。总而言之,这是对我有用的
至少8字符
至少1数字字符
至少1小写字母
至少1大写字母
至少1特殊字符
/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\w\s]).{8,}$/ 简单演示涵盖各种情况
方案六
导入JavaScript文件jquery.validate.min.js。
您可以使用此方法:
JavaScript 代码:
$.validator.addMethod("pwcheck", function (value) {
return /[\@\#\$\%\^\&\*\(\)\_\+\!]/.test(value) && /[a-z]/.test(value) && /[0-9]/.test(value) && /[A-Z]/.test(value)
});
至少1个大写英文字母
至少1个小写英文字母
至少1位数字
至少1个特殊字符
方案七
尝试这个:
– 最少6个字符
– 至少有1个大写字符
– 至少1个小写字符
– 至少1个特殊字符
表达式:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[email protected]$!%*?&.])[A-Za-z\[email protected]$!%*?&.]{6, 20}/
可选特殊字符:
至少1个特殊字符
至少1个数字
特殊字符是可选的
最少6个字符,最多16个字符
表达式:
/^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$/
如果不需要最小和最大条件,则删除.{6, 16}
– 6是最小字符数限制
– 20是最大字符限制
– ?=表示匹配表达式
关联文章:js常用的正则校验:https://blog.csdn.net/baidu_39812199/article/details/107490390
下一篇: github的使用