前言:
密碼強度是一個很普遍的功能,比較簡單描孟,主要是怎么制定這個強度規(guī)則∈荒溃現(xiàn)在需要升級密碼強度的驗證,以前的驗證比較簡單匿醒,現(xiàn)在已經(jīng)不能滿足需求了场航,現(xiàn)在需要可靈活變化并有多級別可配置選擇的一個密碼強度驗證,所以就設(shè)計了下面這個東東青抛。在設(shè)計前也參考了下比較成熟的強度規(guī)則旗闽,大同小異,不外乎都采取了打分的機制來控制密碼強度規(guī)則蜜另,這樣可配置性高适室,靈活。本來想直接拿來用的举瑰,但是發(fā)現(xiàn)都比較舊捣辆,有些不太適宜公司開發(fā)的需求,可能這個東西比較簡單吧此迅,所以也沒什么人去更新和寫新的代碼汽畴,所以還是自己動手設(shè)計了規(guī)則和寫了代碼。
實現(xiàn):
原理:
采用打分的機制耸序,打分分為3類(基礎(chǔ)分忍些、加分、減分)坎怪,先求出基礎(chǔ)分罢坝,在計算加分的部分,最后減去要扣除的分?jǐn)?shù)就為最終總分搅窿。
規(guī)則:
密碼可輸入類型(字符嘁酿,字母大寫,字母小寫男应,特殊字符)闹司。
基礎(chǔ)分為,密碼長度沐飘,一個長度為一分游桩,大于18個字符都為18分牲迫;密碼里面包含一種可輸入類型,基礎(chǔ)分加4分众弓。
加分為恩溅,一種密碼可輸入類型的總數(shù)量大于等于2個,加分2分谓娃,如果總數(shù)量大于等于5,加分4分蜒滩。
減分為滨达,如果有連續(xù)重復(fù)的單個種類字符,則重復(fù)一次減1分俯艰。
總分50分捡遍。
0~10分:不合格(弱)
11~20分:一般
21~30分:中
31~40分:強
41~50分:安全
*分?jǐn)?shù)范圍可以自由調(diào)整和搭配,其實整個打分規(guī)則都可以根據(jù)需要修改
code:
function passwordGrade(pwd) {
var score = 0;
var regexArr = ['[0-9]', '[a-z]', '[A-Z]', '[\\W_]'];
var repeatCount = 0;
var prevChar = '';
//check length
var len = pwd.length;
score += len > 18 ? 18 : len;
//check type
for (var i = 0, num = regexArr.length; i < num; i++) { if (eval('/' + regexArr[i] + '/').test(pwd)) score += 4; }
//bonus point
for (var i = 0, num = regexArr.length; i < num; i++) {
if (pwd.match(eval('/' + regexArr[i] + '/g')) && pwd.match(eval('/' + regexArr[i] + '/g')).length >= 2) score += 2;
if (pwd.match(eval('/' + regexArr[i] + '/g')) && pwd.match(eval('/' + regexArr[i] + '/g')).length >= 5) score += 2;
}
//deduction
for (var i = 0, num = pwd.length; i < num; i++) {
if (pwd.charAt(i) == prevChar) repeatCount++;
else prevChar = pwd.charAt(i);
}
score -= repeatCount * 1;
return score;
}
打分例子:
1111=7分
1@dA=20分
111111=9分
abcdef1=19分
abcd12=18分
abc123=18分
ab123A=22分
aA12j@=26分
aasdfkjjsjjj=16分
111111111dsfskjjkjeh=25分
1111dsfskjjkjeh=25分
1231kb#4ktSF!T@s^j#hkWH=50分
skhk3293ks=24分
sfh#4hHdk=29分
bure12#sk=27分
a@s@dk23=26分
bruceLi@09kt=34分
END