JavaScript动态检测密码强度原理及实现方法详解


Posted in Javascript onJune 11, 2019

本文实例讲述了JavaScript动态检测密码强度原理及实现方法。分享给大家供大家参考,具体如下:

在注册账户,设置密码时,会出现密码强度动态检测,网上看了一些帖子,大多只写了具体的实现过程,而没有对原理的分析过程。下面着重讲一下其原理。

原理分析

通常实现密码强度动态判断有两种方案实现:

  • 正则。但其效率低一点,难度也大一些。
  • 字符串,函数和运算符。

这里用第二种方案,但是如何判断一个密码串是强还是弱呢?

一般我们的密码会设置为数字、字母(大小写)、特殊符号三类。

  • 强:密码串包含其中三种或以上
  • 中:密码串包含其中两种
  • 弱:密码串包含其中一种

字符类型 二进制表示 ASCII
数字 0001 48~57
小写字母 0010 97~122
大写字母 0100 65~90
特殊字符 1000 其他

如有一些字符串:

字符串 二进制表示 十进制
5972 0001 || 0001 || 0001 || 0001 0001 —> 1
boa 0010 || 0010 || 0010 0010 —> 2
AOPA 0100 || 0100 || 0100 || 0100 0100 —> 4
@!_$# 1000 || 1000 || 1000 || 1000 || 1000 1000 —> 8
12ab(2种) 0001 || 0001 || 0010 || 0010 0011—> 3
12Ab(3种) 0001 || 0001 || 0100 || 0010 0111—> 7
1_Ab(4种) 0001 || 1000 || 0100 || 0010 1111—> 15

也就是4位二进制数,1的个数越多,密码强度越大,四盏灯,亮的个数越多,照的越亮。

把1的个数转换为强度:

循环4次,每次和1做“位与”运算。如果得到真,那么强度等级+1,否则不加。每循环完一次,移位操作一次。

如A3cd:0111

第一次:0111 & 1 = 1; level = 1; 右移一位,0011
第二次:0011 & 1 = 1; levle = 2; 右移一位,0001
第三次:0001 & 1 = 1; level = 3; 右移一位,0000
第四次:0000 & 1 = 0; level = 3; 右移一位,0000

level为3,是强密码。

代码实现

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>3water.com 密码强度检测</title>
  </head>
  <style type="text/css">
    .default {background: #eeeeee;}
    .weak {background: #FF0000;}
    .medium {background: #FF9900;}
    .strong {background: #33CC00;}
    input {height: 20px; line-height: 20px;width: 210px;}
    span {display: inline-block;width: 70px;height: 30px;line-height: 30px;background: #ddd;text-align: center;margin: 4px 2px;}
  </style>
  <script type="text/javascript">
    window.onload = function(){
      var oInput = document.getElementById('pwd');
      oInput.value = '';
      var spans = document.getElementsByTagName('span');
      oInput.onkeyup = function(){
        //强度状态设为默认
        spans[0].className = spans[1].className = spans[2].className = "default";
        var pwd = this.value;
        var result = 0;
        for(var i = 0, len = pwd.length; i < len; ++i){
          result |= charType(pwd.charCodeAt(i));
        }
        var level = 0;
        //对result进行四次循环,计算其level
        for(var i = 0; i <= 4; i++){
          if(result & 1){
            level ++;
          }
          //右移一位
          result = result >>> 1;
        }
        if(pwd.length >= 6){
          switch (level) {
            case 1:
              spans[0].className = "weak";
              break;
            case 2:
              spans[0].className = "medium";
              spans[1].className = "medium";
              break;
            case 3:
            case 4:
              spans[0].className = "strong";
              spans[1].className = "strong";
              spans[2].className = "strong";
              break;
          }
        }
      }
    }
    /*
      定义一个函数,对给定的数分为四类(判断密码类型),返回十进制1,2,4,8
      数字 0001 -->1 48~57
      小写字母 0010 -->2 97~122
      大写字母 0100 -->4 65~90
      特殊 1000 --> 8 其它
    */
    function charType(num){
      if(num >= 48 && num <= 57){
        return 1;
      }
      if (num >= 97 && num <= 122) {
        return 2;
      }
      if (num >= 65 && num <= 90) {
        return 4;
      }
      return 8;
    }
  </script>
  <body>
    <label for="">请输入密码:</label><input id ='pwd' type="text" name="pwd" /><br>
    <label for="">密 码 强 度:</label><span>弱</span><span>中</span><span>强</span>
  </body>
</html>

运行效果

JavaScript动态检测密码强度原理及实现方法详解

JavaScript动态检测密码强度原理及实现方法详解

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

Javascript 相关文章推荐
Jquery中给animation加更多的运作效果实例
Sep 05 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
Nov 05 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
jquery+ajax实现跨域请求的方法
Jan 20 Javascript
JS运动相关知识点小结(附弹性运动示例)
Jan 08 Javascript
angularjs+bootstrap实现自定义分页的实例代码
Jun 19 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
Sep 26 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
聊聊Vue 中 title 的动态修改问题
Jun 11 #Javascript
vue+element模态框中新增模态框和删除功能
Jun 11 #Javascript
vue.js中导出Excel表格的案例分析
Jun 11 #Javascript
ES6 Proxy实现Vue的变化检测问题
Jun 11 #Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 #Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 #Javascript
JS中实现一个下载进度条及播放进度条的代码
Jun 10 #Javascript
You might like
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
学习ExtJS TextField常用方法
2009/10/07 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
python 不关闭控制台的实现方法
2011/10/23 Python
浅析Python中signal包的使用
2015/11/13 Python
python中的colorlog库使用详解
2019/07/05 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python列表切片常用操作实例解析
2020/03/10 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
迟到检讨书500字
2014/02/05 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
表扬稿格式范文
2015/01/16 职场文书
网络营销计划
2015/01/17 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL