一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
密码强度,指一个密码对抗猜测或是暴力破解的有效程度。一般来说,指一个未授权的访问者得到正确密码的平均尝试次数。密码的强度和其长度、复杂度及不可预测度有关。强密码可以降低安全漏洞的整体风险,但并不能降低采取其他安全措施的需要。
攻击者可以提交猜测到的密码的速率是衡量一个系统安全性的重要因素。有的系统在多次尝试失败后会暂停登入一段时间,在没有其他安全缺陷时,这种系统可以用相对简单的密码保护。但是系统必须以某种形式存储用户密码,而当这些数据被盗时,就有极大的危险。(via.百度百科)
一、简易版密码强度规则
- 密码长度至少8位;密码含有数字&字母;
- 密码含有符号;
- 含有字母大小写。
规则:
- 符合2项以上允许注册。
- 不符合针对项目进行针对性提示。
二、常规版密码强度规则
一、密码长度:
- 5 分: 小于等于 4 个字符
- 10 分: 5 到 7 字符
- 25 分: 大于等于 8 个字符
二、字母:
- 0 分: 没有字母
- 10 分: 全都是小(大)写字母20 分: 大小写混合字母
三、数字:
- 0分: 没有数字
- 10分: 1 个数字
- 20分: 大于等于 3个数字
四、符号:
- 0分: 没有符号
- 10分: 1个符号
- 25分: 大于1个符号
五、奖励:
- 2分: 字母和数字
- 3分: 字母、数字和符号
- 5分: 大小写字母、数字和符号
六、规则:
-
= 90: 非常安全
-
= 80: 安全(Secure)
-
= 70: 非常强
-
= 60: 强(Strong)
-
= 50: 一般(Average)
-
= 25: 弱(Weak)
-
= 0: 非常弱
三、专业版密码强度规则
符合密码基本规则者为70分。
- +(总字元数-8) × 4
- +(字母字元数-大写字母字元数) × (字母字元数-小写字母字元数) × 2
- -(接连重复(Repeat)字元数) × 2
- -(接连(Consecutive)数字字元数-3) × 1
- -(接连(Consecutive)字母字元数-3) × 1
- -(3码以上的连续(sequential)数字) × 3
- -(3码以上的连续(sequential)字母) × 3
规则:
- 总分低於60者为弱(weak),高
- 于80者(含)为强(strong),介於兩者之间为中等(medium)。
四、骨灰版密码强度规则
分数区间:
- 60>x>0:未达标准
- 70>x≥60:警告
- 80>x≥70:已达标准
- x≥80:优秀(100为上限)
符号说明:
- Flat:均一的 加/扣分 比例。
- Incr:出现次数越多,加/扣分 比例越大。
- Cond:根据增加的字元数调整 加/扣分 比例。
- n:出现次数。
- len:密码字串长度。
积分说明:
- 增加字符的变化能提高分数。
- 最后的分数为加分项目和减分项目的总和。
- 分数的范围为0~100分。
- 分数不需达到最低字元即可计算。
规则说明:
- 密码最低要求8字元
- 最少符合下列4项中3项规则:- 大写英文字元- 小写英文字元- 数字字元- 符号字元
加分项目
- 密码字数/Flat/+(n*4)
- 大写英文字母/Cond或Incr/+((len-n)*2)
- 小写英文字母/Cond或Incr/+((len-n)*2)
- 数字字元/Cond/+(n*4)
- 符号字元/Flat/+(n*6)
- 密码中间穿插数字或符号字元/Flat/+(n*2)
- 已达到密码最低要求项目/Flat/+(n*2)
扣分项目
- 只有英文字元/Flat/-n
- 只有数字字元/Flat/-n
- 重复字元(Case Insensitive)/Incr/-(n(n-1))
- 连续英文大写字元/Flat/-(n*2)
- 连续英文小写字元/Flat/-(n*2)
- 连续数字字元/Flat/-(n*2)
- 连续字母超过三个(如abc, def)/Flat/-(n*3)
- 连续数字超过三个(如123,234)/Flat/-(n*3)
示例:
- 密码:Aa123 分数:43分 强度:未达标准
- 密码:Aa12L3 分数:64分 强度:警告
五、HACK版密码强度规则
说明:不在彩虹表中的密码强度较高(彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。)
常规项目
我觉得参考常规版密码强度规则,应该够用了,因此写了个 JS 实现
const passwordCheck = (password) => {
let count = 0;
//密码长度:5 分: 小于等于 4 个字符 10 分: 5 到 7 字符– 25 分: 大于等于 8 个字符
let reg = new RegExp(/^.{1,4}$/g)
if (reg.test(password)) {
count += 5
}
reg = new RegExp(/^.{5,7}$/g)
if (reg.test(password)) {
count += 10
}
reg = new RegExp(/^.{8,}$/g)
if (reg.test(password)) {
count += 25
}
//字母:0 分: 没有字母 10 分: 全都是小(大)写字母 20 分: 大小写混合字母
let reg1 = new RegExp(/[a-z]/g).test(password)
let reg2 = new RegExp(/[A-Z]/g).test(password)
if (reg1 && reg2) {
count += 20
} else if (reg1 && !reg2) {
count += 10
} else if (!reg1 && reg2) {
count += 10
}
//数字 0分: 没有数字 10分: 1 个数字 20分: 大于等于 3个数字
let res = password.match(/[0-9]/g)
if (res && res.length >= 3) {
count += 20
} else if (res && res.length < 3) {
count += 10
}
// 特殊符号 0分: 没有符号 10分: 1个符号 25分: 大于1个符号
res = password.match(/[\\!"#\$%&'\(\)\*\+,-\./:;<=>\?@\[\]\^_`\{|\}~]/g)
if (res && res.length === 1) {
count += 10
} else if (res && res.length > 1) {
count += 25
}
// 奖励 2分: 字母和数字 3分: 字母、数字和符号 5分: 大小写字母、数字和符号
let flag1 = new RegExp(/[a-z]/g).test(password)
let flag2 = new RegExp(/[A-Z]/g).test(password)
let flag3 = new RegExp(/[0-9]/g).test(password)
let flag4 = new RegExp(/[\\!"#\$%&'\(\)\*\+,-\./:;<=>\?@\[\]\^_`\{|\}~]/g).test(password)
if ((flag1 || flag2) && flag3) {
count += 2
}
if ((flag1 || flag2) && flag3 && flag4) {
count += 3
}
if (flag1 && flag2 && flag3 && flag4) {
count += 5
}
// >= 90: 非常安全
// >= 80: 安全(Secure)
// >= 70: 非常强
// >= 60: 强(Strong)
// >= 50: 一般(Average)
// >= 25: 弱(Weak)
// >= 0: 非常弱
return count
}