关于密码安全程度的javascript实现分析

很多的网站,在你输入密码的时候,都有对密码强度的判断,通过你输入的不同的字符,将密码分为:太短、很弱、一般、很强,现在就来看看javascript中是怎么实现的,先看看输入四种字符,所显示的四种不同情况:
一:输入”!@”,显示的效果是:
密码太短
二:输入”!@#$”,显示的效果是:
密码很弱
三:输入”!@#$qaz”,显示的效果是:
密码一般
三:输入”!@#$qaz123″,显示的效果是:
密码很强

再来看看他们的实现效果,先看看密码输入框的代码:
密码输入框
看到有一个javascript键盘事件,并执行一个函数checkPwd(this.value);,密码强度就是通过这个函数进行判断的,看看这个函数的代码实现过程 

JavaScript代码
  1. function checkPwd(pwd){   
  2.   
  3.     if (pwd == "") {   
  4.         $("chkpswd").className = "psdiv0";//如果密码为空,则设置为初始化的样式   
  5.         $("chkpswdcnt").innerHTML = "";   
  6.     } else if (pwd.length < 3) {//如果密码小于3位数,也就是我们前面所说的第一种情况  
  7.         $("chkpswd").className = "psdiv1";   
  8.         $("chkpswdcnt").innerHTML = "太短";   
  9.     } else if(!isPassword(pwd) || !/^[^%&amp;]*$/.test(pwd)) {//密码中包含“^%&amp;”或是ascii码大于255,则不显示密码强度  
  10.         $("chkpswd").className = "psdiv0";   
  11.         $("chkpswdcnt").innerHTML = "";   
  12.     } else {   
  13.         var csint = checkStrong(pwd);//判断的样式,共有几种字符组合而成  
  14.         switch(csint) {   
  15.             case 1://如果为1,则表示只有一种字符组成,比如111或是abc  
  16.                 $("chkpswdcnt").innerHTML = "很弱";   
  17.                 $( "chkpswd" ).className = "psdiv"+(csint + 1);   
  18.                 break;   
  19.             case 2://如果为2,则表示有两种字符组成,如果11aa或是!@#qaz  
  20.                 $("chkpswdcnt").innerHTML = "一般";   
  21.                 $( "chkpswd" ).className = "psdiv"+(csint + 1);   
  22.                 break;   
  23.             case 3: //有三个字符组成,12as!@  
  24.                 $("chkpswdcnt").innerHTML = "很强";   
  25.                 $("chkpswd").className = "psdiv"+(csint + 1);   
  26.                 break;   
  27.         }   
  28.     }   
  29. }   
  30. function isPassword(str){   
  31.     if (str.length < 3) return false;   
  32.     var len;   
  33.     var i;   
  34.     len = 0;   
  35.     for (i=0;i<str.length;i++){   
  36.         if (str.charCodeAt(i)>255) return false;//charCodeAt(i);显示字符的ascii码值  
  37.     }   
  38.     return true;   
  39. }   
  40. function charMode(iN){   
  41.     if (iN>=48 &amp;&amp; iN <=57) //数字  
  42.     return 1;   
  43.     if (iN>=65 &amp;&amp; iN <=90) //大写字母  
  44.     return 2;   
  45.     if (iN>=97 &amp;&amp; iN <=122) //小写  
  46.     return 4;   
  47.     else  
  48.     return 8; //特殊字符  
  49. }   
  50. //计算出当前密码当中一共有多少种模式  
  51. //当num=12  
  52. function bitTotal(num){   
  53.     modes=0;   
  54.     for (i=0;i<4;i++){   
  55.         if (num & 1) modes++; //12的二进制是:00001100 & 00000001 = 0,所以不自增,当i=2时还是为0,只有当i=3与4时,modes才自增加  
  56.         num>>>=1; //向右移一位,00000110  
  57.     }   
  58.     //最后modes=2  
  59.     return modes;   
  60. }    
  61.   
  62. //返回密码的强度级别  
  63. function checkStrong(pwd){   
  64.     modes=0;   
  65.     for (i=0;i<pwd.length;i++){   
  66.         //测试每一个字符的类别并统计一共有多少种模式.  
  67.         modes|=charMode(pwd.charCodeAt(i));   
  68.         //将每一个字符的类型进行"或"运算,比如密码是:!@qaz,第1、2字符因为都是特殊字符所以都返回8,8的二进制是:00001000,  
  69.         //8|8,也就是00001000|00001000仍为00001000,密码的后三位是小写字母,  
  70.         //所以返回的是:4,00001000|00000100,得到的值是:00001100,为12,则modes = 12  
  71.     }   
  72.     return bitTotal(modes);   
  73. }  
如果您觉得我的文章有帮助,请随意赞赏!

*发表评论

用QQ账号登录  请登录后发表评论