2013-03-28 92 views
4

我已經寫了正則表達式,其可潛在地用於密碼強度驗證:爲密碼強度驗證正則表達式

^(?:([A-Z])*([a-z])*(\d)*(\W)*){8,12}$ 

表達由四組:

  1. 零個或多個大寫字符
  2. 零個或多個小寫字符
  3. 零個或多個十進制數字
  4. 零個或多個非單詞字符(!,£,$,%等)

我希望它的工作方式是,以確定有多少組的人爲了確定強度被匹配的密碼。例如,如果只有一個組匹配,它會很弱。如果所有四個組合都匹配,那就會很強大。

我已經測試使用Rubular (a Ruby regular expression editor).

這裏我可以看到在視覺上,有多少組相匹配的表情,但我想這樣做在JavaScript中。我寫了一個腳本來返回匹配組的數量,但結果與我在Rubular中看到的不一樣。

我該如何在JavaScript中實現這一點?並且是我的正規表達直到任務?

+1

你的正則表達式允許密碼具有無限長,'{8,12}'沒有影響。硬編碼你想允許的非單詞字符。我想你想要的東西像'^ [A-Za-z0-9!_.-] {8,12} $'。 「 – sp00m 2013-03-28 09:51:32

+0

」但結果不一樣「:以什麼方式?請包括*兩組結果以及您用於生成結果的代碼。 – Richard 2013-03-28 09:53:05

+1

請注意,您的表達式僅在*大寫字母后檢查小寫字母*;和之後的數字; ...。它也不認爲下劃線是非字母數字字符。 – Richard 2013-03-28 09:55:05

回答

8

我想你必須獨立檢查每個組。僞代碼:

bool[] array = {}; 
array[0] = pwd.match(/[A-Z]/); 
array[1] = pwd.match(/[a-z]/); 
array[2] = pwd.match(/\d/); 
array[3] = pwd.match(/[!_.-]/); 

int sum = 0; 
for (int i=0; i<array.length; i++) { 
    sum += array[i] ? 1 : 0; 
} 

switch (sum) { 
    case 0: print("weird..."); break; 
    case 1: print("weak"); break; 
    case 2: print("ok"); break; 
    case 3: print("strong"); break; 
    case 4: print("awesome"); break; 
    default: print("weird..."); break; 
} 
+0

謝謝。稍作修改就解決了我的問題! :-) – series0ne 2013-03-28 10:51:51

1

可以通過每一組出來分離做,並通過一個匹配它們之一,這樣的:

var level = 0; 
var input = '';//user input goes here 
switch(true){ 
    case /^(?:([A-Z])*){8,12}$/.test(input): 
    level = 1; 
    break; 

    case /^(?:([A-Z])*([a-z])*){8,12}$/.test(input): 
    level = 2; 
    break; 

    case /^(?:([A-Z])*([a-z])*(\d)*){8,12}$/.test(input): 
    level = 3; 
    break; 

    case /^(?:([A-Z])*([a-z])*(\d)*(\W)*){8,12}$/.test(input): 
    level = 4; 
    break; 
} 

level變量從1(最弱)至4(最強)不用。

3

這裏是基於sp00m的回答我的最終解決方案:

function testPassword(pwString) { 
    var strength = 0; 

    strength += /[A-Z]+/.test(pwString) ? 1 : 0; 
    strength += /[a-z]+/.test(pwString) ? 1 : 0; 
    strength += /[0-9]+/.test(pwString) ? 1 : 0; 
    strength += /[\W]+/.test(pwString) ? 1 : 0; 

    switch(strength) { 
     case 3: 
      // its's medium! 
      break; 
     case 4: 
      // it's strong! 
      break; 
     default: 
      // it's weak! 
      break; 
    } 
} 

我加這純粹是爲了參考,但已經接受sp00m的答案,因爲這是他們的答案,讓我到這個解決方案。

0

我的例子

JS/jQuery的

$("#password").change(function() 
{ 
    strongPassword(); 
}); 

/** 
* @author websky 
*/ 
function strongPassword() { 
    var p = document.getElementById('password').value; 
    var label1 = 0; 
    var label2 = 0; 
    var label3 = 0; 
    var label4 = 0; 
    var label5 = 0; 
    if (p.length > 6) {//min length 
     label1 = 1; 
    } 
    if (/[[email protected]#$%^&*?_~]{2,}/.test(p)) {//min 2 special characters 
     label2 = 1; 
    } 
    if (/[a-z]{2,}/.test(p)) {//min 2 a-z 
     label3 = 1; 
    } 
    if (/[A-Z]{2,}/.test(p)) {//min 2 A-Z 
     label4 = 1; 
    } 
    if (/[0-9]{2,}/.test(p)) {//min 2 0-9 
     label5 = 1; 
    } 

    var strong_password = label1 + label2 + label3 + label4 + label5; 

    if(strong_password > 0){ 
     //Here your action 
     // 
     //var progressbar = strong_password * 20; 
     //$("#progressbar").progressbar({value: progressbar}); <== I use jQuery progessbar 
    } 
} 
1

看看這個:http://jsfiddle.net/43tu58jf/

function isSimpleStrongLevel(password){ 
    var stringsOptions = ['123456', '123abc', 'abc123', '654321', '', 'password', '123pass', 'pass123', '123456abc']; 
    return stringsOptions.indexOf(password) != -1; 
} 
function getStrongLevel(password) { 
    var level = 0; 
    level += password.length > 6 ? 1 : 0; 
    level += /[[email protected]#$%^&*?_~]{2,}/.test(password) ? 1 : 0; 
    level += /[a-z]{2,}/.test(password) ? 1 : 0; 
    level += /[A-Z]{2,}/.test(password) ? 1 : 0; 
    level += /[0-9]{2,}/.test(password) ? 1 : 0; 
    return level; 
} 

var password = '123456'; 
var isSimple = isSimpleStrongLevel(password); 
var level = getStrongLevel(password); 
console.log(isSimple, level);