【问题标题】:Regular Expression for Password Strength Validation密码强度验证的正则表达式
【发布时间】:2013-03-18 16:49:25
【问题描述】:

我写了一个正则表达式,它可能用于密码强度验证:

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

表达式由四组组成:

  1. 零个或多个大写字符
  2. 零个或多个小写字符
  3. 零个或多个十进制数字
  4. 零个或多个非单词字符(!、£、$、% 等)

我希望它的工作方式是确定有多少组已匹配,以确定密码的强度。因此,例如,如果只有 1 个组匹配,它会很弱。如果所有四个组都匹配,那将是强大的。

我已经使用Rubular (a Ruby regular expression editor). 测试了表达式

在这里我可以直观地看到匹配了多少组,但我想在 JavaScript 中执行此操作。我写了一个脚本,返回匹配组的数量,但结果与我在 Rubular 中看到的不一样。

如何在 JavaScript 中实现这一点?我的正则表达式能胜任这项任务吗?

【问题讨论】:

  • 您的正则表达式允许无限长度的密码,{8,12} 没有影响。硬编码您想要允许的非单词字符。我猜你想要像^[A-Za-z0-9!_.-]{8,12}$ 这样的东西。
  • “但结果不一样”:以什么方式?请包含两个结果集以及您用来生成这些结果的代码。
  • 注意,你的表达式只检查小写字母之后大写字母;以及之后的数字; ……它也不将下划线视为非字母数字字符。
  • Reference - Password Validation 可以帮到你。

标签: javascript regex validation passwords


【解决方案1】:

试试看 ==>

var PasswordStrength = function () {
    var p_worker = {
        checkMark: function ( msg, mark ) {
            let strength = "Required!!!", status = true;
            switch ( mark ) {
                case 1: strength = '<b style="color:rgb(200, 200, 200)"> Password strength: Weak...</b>'; break;
                case 2: strength = '<b style="color:rgb(200, 200, 200)"> Password strength: Semi-weak...</b>'; break;
                case 3: strength = '<b style="color:green"> Password strength: Medium...</b>'; break;
                case 4: strength = '<b style="color:green"> Password strength: Strong...</b>'; break;
                default: status = false; break;
            }
            return { status: status/*[is valid or not]*/, cur_strength: strength/**[strength msg]*/, req_msg: msg/**[required msg]*/, mark: mark/**[strength mark]*/ };
        },
        setting: {
            n: { rgx: /[0-9]/, msg: '1 Numeric character' },
            c: { rgx: /[A-Z]/, msg: '1 Alphabet character' },
            s: { rgx: /[a-z]/, msg: '1 Small character' },
            sp: { rgx: /[@#$\.%^&+=]/, msg: '1 Special character' },
        }
    };
    return {
        check: function ( value ) {
            let msg = "", mark = 0, c = 0;
            for ( let i in p_worker.setting ) {
                if ( !p_worker.setting[i]['rgx'].test( value ) ) {
                    if ( c === 3 ) {
                        msg += '<d style="color:rgba(219, 177, 177, 0.96)">[*] ' + p_worker.setting[i]['msg'] + '</d>';
                        c++; continue;
                    }
                    msg += '<d style="color:rgba(219, 177, 177, 0.96)">[*] ' + p_worker.setting[i]['msg'] + ',</d></br>';
                    c++; continue;
                }
                if ( c === 3 ) {
                    msg += '<img src="/image/accept.png" /> <d style="color:green">' + p_worker.setting[i]['msg'] + '</d>';
                    mark++; c++; continue;
                }
                msg += '<img src="/image/accept.png" /> <d style="color:green">' + p_worker.setting[i]['msg'] + ',</d></br>';
                mark++; c++;
            }
            return p_worker.checkMark( msg, mark );
        }
    }
}();

使用 ==>

PasswordStrength.check( "1234$#" );

【讨论】:

    【解决方案2】:

    看看这个: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);
    

    【讨论】:

      【解决方案3】:

      我的例子

      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
          } 
      }
      

      【讨论】:

        【解决方案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 的回答,因为正是他们的回答让我得到了这个解决方案。

        【讨论】:

          【解决方案5】:

          我认为您必须独立检查每个组。伪代码:

          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;
          }
          

          【讨论】:

            【解决方案6】:

            您可以通过将每个组分开并一一匹配来做到这一点,如下所示:

            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(最强)。

            【讨论】:

              猜你喜欢
              • 2016-12-17
              • 2010-09-16
              • 2022-12-03
              • 2011-05-06
              • 2016-10-19
              • 2011-03-24
              相关资源
              最近更新 更多