5

パスワード強度の検証に使用できる可能性のある正規表現を作成しました。

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

式は次の 4 つのグループで構成されます。

  1. 0 個以上の大文字
  2. 0 個以上の小文字
  3. 0 桁以上の 10 進数
  4. 0 個以上の単語以外の文字 (!、£、$、% など)

私がそれを機能させたい方法は、パスワードの強度を判断するために、一致したグループの数を判断することです。たとえば、1 つのグループのみが一致する場合、それは弱いものになります。4つのグループがすべて一致した場合、それは強いでしょう.

Rubular (Ruby 正規表現エディター)を使用して式をテストしました。

ここでは、一致するグループの数を視覚的に確認できますが、これを JavaScript で行いたいと考えています。一致したグループの数を返すスクリプトを作成しましたが、結果は Rubular で確認できるものと同じではありませんでした。

JavaScriptでこれを達成するにはどうすればよいですか? そして、私の正規表現は仕事をしていますか?

4

6 に答える 6

9

各グループを個別にチェックする必要があると思います。擬似コード:

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;
}
于 2013-03-28T09:56:38.220 に答える
4

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 の回答がこの解決策につながったので、sp00m の回答を受け入れました。

于 2013-03-28T10:57:18.947 に答える
1

これをチェックしてください:http://jsfiddle.net/43tu58jf/

function isSimpleStrongLevel(password){
    var stringsOptions = ['123456', '123abc', 'abc123', '654321', '012345', 'password', '123pass', 'pass123', '123456abc'];
    return stringsOptions.indexOf(password) != -1;
}
function getStrongLevel(password) {
    var level = 0;
    level += password.length > 6 ? 1 : 0;
    level += /[!@#$%^&*?_~]{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);
于 2015-06-22T10:49:00.483 に答える
1

次のように、各グループを分離して 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;
}

変数は 1 (最もlevel弱い) から 4 (最も強い) まで変化します。

于 2013-03-28T09:56:05.607 に答える
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 (/[!@#$%^&*?_~]{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
    } 
}
于 2015-03-11T09:30:12.587 に答える