Twitter密码强度检测代码

提取https://twitter.com/signup的密码强度检测代码加以处理,无需依赖jquery库。若已经加载jquery库删掉without jquery部分,并用$.inArray代替twttr.inArray、$.map代替twttr.map即可。

var twttr = {};
/*
*without jquery
*/
  indexOf = Array.prototype.indexOf
  //inArray
  twttr.inArray = function (elem, array) {
    if (!array) {
      return -1;
    }
    if (indexOf) {
      return indexOf.call(array, elem);
    }
    for (var i = 0, length = array.length; i < length; i++) {
      if (array[i] === elem) {
        return i;
      }
    }
    return -1;
  }
  //map
  twttr.map = function (elems, callback, arg) {
    var value, key, ret = [],
      i = 0,
      length = elems.length,
      isArray = length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length - 1]) || length === 0 || typeof elems === "array");
    if (isArray) {
      for (; i < length; i++) {
        value = callback(elems[i], i, arg);
        if (value != null) {
          ret[ret.length] = value;
        }
      }
    } else {
      for (key in elems) {
        value = callback(elems[key], key, arg);
        if (value != null) {
          ret[ret.length] = value;
        }
      }
    }
    return ret.concat.apply([], ret);
  }
/*
* //without jquery
*/
  twttr.BANNED_PASSWORDS = [];

    var r = ["000000", "111111", "11111111", "112233", "121212", "123123", "123456", "1234567", "12345678", "123456789", "131313", "232323", "654321", "666666", "696969", "777777", "7777777", "8675309", "987654", "nnnnnn", "nop123", "nop123", "nopqrs", "noteglh", "npprff", "npprff14", "npgvba", "nyoreg", "nyoregb", "nyrkvf", "nyrwnaqen", "nyrwnaqeb", "nznaqn", "nzngrhe", "nzrevpn", "naqern", "naqerj", "natryn", "natryf", "navzny", "nagubal", "ncbyyb", "nccyrf", "nefrany", "neguhe", "nfqstu", "nfqstu", "nfuyrl", "nffubyr", "nhthfg", "nhfgva", "onqobl", "onvyrl", "onanan", "onearl", "onfronyy", "ongzna", "orngevm", "ornire", "ornivf", "ovtpbpx", "ovtqnqql", "ovtqvpx", "ovtqbt", "ovtgvgf", "oveqvr", "ovgpurf", "ovgrzr", "oynmre", "oybaqr", "oybaqrf", "oybjwbo", "oybjzr", "obaq007", "obavgn", "obaavr", "obbobb", "obbtre", "obbzre", "obfgba", "oenaqba", "oenaql", "oenirf", "oenmvy", "oebapb", "oebapbf", "ohyyqbt", "ohfgre", "ohggre", "ohggurnq", "pnyiva", "pnzneb", "pnzreba", "pnanqn", "pncgnva", "pneybf", "pnegre", "pnfcre", "puneyrf", "puneyvr", "purrfr", "puryfrn", "purfgre", "puvpntb", "puvpxra", "pbpnpbyn", "pbssrr", "pbyyrtr", "pbzcnd", "pbzchgre", "pbafhzre", "pbbxvr", "pbbcre", "pbeirggr", "pbjobl", "pbjoblf", "pelfgny", "phzzvat", "phzfubg", "qnxbgn", "qnyynf", "qnavry", "qnavryyr", "qroovr", "qraavf", "qvnoyb", "qvnzbaq", "qbpgbe", "qbttvr", "qbycuva", "qbycuvaf", "qbanyq", "qentba", "qernzf", "qevire", "rntyr1", "rntyrf", "rqjneq", "rvafgrva", "rebgvp", "rfgeryyn", "rkgerzr", "snypba", "sraqre", "sreenev", "sveroveq", "svfuvat", "sybevqn", "sybjre", "sylref", "sbbgonyy", "sberire", "serqql", "serrqbz", "shpxrq", "shpxre", "shpxvat", "shpxzr", "shpxlbh", "tnaqnys", "tngrjnl", "tngbef", "trzvav", "trbetr", "tvnagf", "tvatre", "tvmzbqb", "tbyqra", "tbysre", "tbeqba", "tertbel", "thvgne", "thaare", "unzzre", "unaanu", "uneqpber", "uneyrl", "urngure", "uryczr", "uragnv", "ubpxrl", "ubbgref", "ubearl", "ubgqbt", "uhagre", "uhagvat", "vprzna", "vybirlbh", "vagrearg", "vjnagh", "wnpxvr", "wnpxfba", "wnthne", "wnfzvar", "wnfcre", "wraavsre", "wrerzl", "wrffvpn", "wbuaal", "wbuafba", "wbeqna", "wbfrcu", "wbfuhn", "whavbe", "whfgva", "xvyyre", "xavtug", "ynqvrf", "ynxref", "ynhera", "yrngure", "yrtraq", "yrgzrva", "yrgzrva", "yvggyr", "ybaqba", "ybiref", "znqqbt", "znqvfba", "znttvr", "zntahz", "znevar", "znevcbfn", "zneyobeb", "znegva", "zneiva", "znfgre", "zngevk", "znggurj", "znirevpx", "znkjryy", "zryvffn", "zrzore", "zreprqrf", "zreyva", "zvpunry", "zvpuryyr", "zvpxrl", "zvqavtug", "zvyyre", "zvfgerff", "zbavpn", "zbaxrl", "zbaxrl", "zbafgre", "zbetna", "zbgure", "zbhagnva", "zhssva", "zhecul", "zhfgnat", "anxrq", "anfpne", "anguna", "anhtugl", "app1701", "arjlbex", "avpubynf", "avpbyr", "avccyr", "avccyrf", "byvire", "benatr", "cnpxref", "cnagure", "cnagvrf", "cnexre", "cnffjbeq", "cnffjbeq", "cnffjbeq1", "cnffjbeq12", "cnffjbeq123", "cngevpx", "crnpurf", "crnahg", "crccre", "cunagbz", "cubravk", "cynlre", "cyrnfr", "cbbxvr", "cbefpur", "cevapr", "cevaprff", "cevingr", "checyr", "chffvrf", "dnmjfk", "djregl", "djreglhv", "enoovg", "enpury", "enpvat", "envqref", "envaobj", "enatre", "enatref", "erorppn", "erqfxvaf", "erqfbk", "erqjvatf", "evpuneq", "eboreg", "eboregb", "ebpxrg", "ebfrohq", "ehaare", "ehfu2112", "ehffvn", "fnznagun", "fnzzl", "fnzfba", "fnaqen", "fnghea", "fpbbol", "fpbbgre", "fpbecvb", "fpbecvba", "fronfgvna", "frperg", "frkfrk", "funqbj", "funaaba", "funirq", "fvreen", "fvyire", "fxvccl", "fynlre", "fzbxrl", "fabbcl", "fbppre", "fbcuvr", "fcnaxl", "fcnexl", "fcvqre", "fdhveg", "fevavinf", "fgnegerx", "fgnejnef", "fgrryref", "fgrira", "fgvpxl", "fghcvq", "fhpprff", "fhpxvg", "fhzzre", "fhafuvar", "fhcrezna", "fhesre", "fjvzzvat", "flqarl", "grdhvreb", "gnlybe", "graavf", "grerfn", "grfgre", "grfgvat", "gurzna", "gubznf", "guhaqre", "guk1138", "gvssnal", "gvtref", "gvttre", "gbzpng", "gbctha", "gblbgn", "genivf", "gebhoyr", "gehfgab1", "ghpxre", "ghegyr", "gjvggre", "havgrq", "intvan", "ivpgbe", "ivpgbevn", "ivxvat", "ibbqbb", "iblntre", "jnygre", "jneevbe", "jrypbzr", "jungrire", "jvyyvnz", "jvyyvr", "jvyfba", "jvaare", "jvafgba", "jvagre", "jvmneq", "knivre", "kkkkkk", "kkkkkkkk", "lnznun", "lnaxrr", "lnaxrrf", "lryybj", "mkpioa", "mkpioaz", "mmmmmm"];

  twttr.PasswordStrength = (function () {
    function D(E) {
      return (typeof E === "function")
    }
    function C(F, I) {
      var E = "";
      for (var H = 0; H < I.length; H++) {
        var J = true;
        for (var G = 0; G < F && (G + H + F) < I.length; G++) {
          J = J && (I.charAt(G + H) == I.charAt(G + H + F))
        }
        if (G < F) {
          J = false
        }
        if (J) {
          H += F - 1;
          J = false
        } else {
          E += I.charAt(H)
        }
      }
      return E
    }
    return {
      check: function (G, F) {
        var K = 0,
          F = F || {};
        if (G.length < (F.minlength || 6)) {
          return {
            score: 0,
            msgClass: "tooshort"
          }
        }
        if (G.match(/\s/)) {
          return {
            score: 0,
            msgClass: "whitespace"
          }
        }
        var J = G.toLowerCase();
        if (F.username && J == (D(F.username) ? F.username() : F.username).toLowerCase()) {
          return {
            score: 0,
            msgClass: "obvious"
          }
        }
        if (twttr.inArray(J, twttr.BANNED_PASSWORDS || []) != -1) {
          return {
            score: 0,
            msgClass: "banned"
          }
        }
        if (F.requireStrong) {
          var E = "# ` ~ ! @ $ % ^ & * ( ) - _ = + [ ] { } | ; : ' \" , . < > / ?".split(" ");
          E = twttr.map(E, function (L) {
            return "\\" + L
          }).join("");
          var H = ["\\d", "[a-z]", "[A-Z]", "[" + E + "]"];
          var I = twttr.map(H, function (L) {
            return "(?=.*" + L + ")"
          }).join("");
          if (!G.match(new RegExp("(" + I + "){10,}"))) {
            return {
              score: 0,
              msgClass: "tooweak"
            }
          }
        }
        K += G.length * 4;
        K += (C(1, G).length - G.length) * 1;
        K += (C(2, G).length - G.length) * 1;
        K += (C(3, G).length - G.length) * 1;
        K += (C(4, G).length - G.length) * 1;
        if (G.match(/(.*[0-9].*[0-9].*[0-9])/)) {
          K += 5
        }
        if (G.match(/(.*[!@#$%^&*?_~].*[!@#$%^&*?_~])/)) {
          K += 5
        }
        if (G.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
          K += 10
        }
        if (G.match(/([a-zA-Z])/) && G.match(/([0-9])/)) {
          K += 15
        }
        if (G.match(/([!@#$%^&*?_~])/) && G.match(/([0-9])/)) {
          K += 15
        }
        if (G.match(/([!@#$%^&*?_~])/) && G.match(/([a-zA-Z])/)) {
          K += 15
        }
        if (G.match(/^\w+$/) || G.match(/^\d+$/)) {
          K -= 10
        }
        if (K < 0) {
          K = 0
        }
        if (K > 100) {
          K = 100
        }
        if (K < 34) {
          return {
            score: K,
            msgClass: "weak"
          }
        }
        if (K < 50) {
          return {
            score: K,
            msgClass: "good"
          }
        }
        if (K < 75) {
          return {
            score: K,
            msgClass: "strong"
          }
        }
        return {
          score: K,
          msgClass: "verystrong"
        }
      }
    }
  }());

用法:twttr.PasswordStrength.check(password,{username:username,minlength:number,requireStrong:true/false});
返回:{score:number,msgClass:string}

项目托管地址:http://hujuntao.googlecode.com/svn/trunk/password/PasswordStrength.js

“Twitter密码强度检测代码”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注