密码长度增加,放宽密码复杂性要求

时间:2014-05-30 12:22:46

标签: javascript passwords

我有以下JavaScript函数:

function checkPassword(password) {
    if (password.match(/[A-Z]/) 
      && password.match(/[a-z]/) 
      && password.match(/[0-9]/) 
      && password.match(/[£:#@~\.,|(etc....)]/) 
      && password.length >= 6) {
        return true;
    } else {
        return false;
    }  
}

我想要做的是更改它,以便当密码长度超过16时,只需要3个大写,小写,数字和符号以及超过32个字符长只需要2个字符类型。我该怎么做呢?

这是我迄今为止所拥有的,但它似乎很大,我相信必须有更好,更有效或至少更整洁的方式:

function checkPassword(password) {
    var matched = 0;
    if (password.match(/[A-Z]/)) {
        matched++;
    }
    if (password.match(/[a-z]/)) {
        matched++;
    }
    if (password.match(/[0-9]/)) { 
        matched++;
    }
    if (password.match(/[£:#@~\.,|(etc....)]/)) { 
        matched++;
    }
    if (matched >= 4 && password.length >= 6) {
        return true;
    }
    if (matched >= 3 && password.length >= 16) {
        return true;
    }
    if (matched >= 2 && password.length >= 32) {
        return true;
    }
    return false;
}

我认为我的问题是,我需要检查两个变量matchedpassword.length

2 个答案:

答案 0 :(得分:1)

计算它匹配的字符类型类别的数量,并将其添加到Math.floor(password.length/16.0)(即,整个次数16进入密码)。然后,检查总值是否至少为4.这仍然需要代码的第一部分:

function checkPassword(password) {
    var matched = 0;
    if (password.match(/[A-Z]/)) {
        matched++;
    }
    if (password.match(/[a-z]/)) {
        matched++;
    }
    if (password.match(/[0-9]/)) { 
        matched++;
    }
    if (password.match(/[£:#@~\.,|(etc....)]/)) { 
        matched++;
    }

......但其余的更简单,只留下一个条件来检查:

    matched += Math.floor(password.length/16.0);
    if (matched >= 4 && password.length > 6) {
        return true;
    }
    return false;
}

如果你想进一步缩短它,可以将你的正则表达式放在一个列表中并循环它们。

请记住,如果密码不够好,这将使您难以向用户解释缺少的内容:通常显示特定于缺少用户密码的错误消息(例如大写字母) ,符号等)。你不会有这个,因为你不会知道它们缺少什么(并且它们有多种选择来修复它,因此它们并没有真正丢失它们的特定事物)。如果你想显示好的,特定的错误信息,你就会遇到长代码。

答案 1 :(得分:1)

我不得不对此提出更多想法,但是这样的伎俩如何:

var password = "S0m3p@ssword";
var count= 0;

var r = password.replace(/([A-Z])|([a-z])|([0-9])|([£:#@~\.,])/g,function(match,upperChars,lowersChars,numbers,specialChars){
    count = count +1;

    if (count >= 4 && password.length >= 6) {
        return "match1";
    }
    if (count >= 3 && password.length >= 16) {
        return "match2";
    }
    if (count >= 2 && password.length >= 32) {
        return "match3";
    }
    return "";
});

console.log(r);

在上面的示例中,如果r.length > 0,则表示密码有效。