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 相关文章推荐
javascript Select标记中options操作方法集合
Oct 22 Javascript
Javascript事件实例详解
Nov 06 Javascript
JavaScript实现图片DIV竖向滑动的方法
Apr 25 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
jquery实现input框获取焦点的方法
Feb 06 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
关于TypeScript中import JSON的正确姿势详解
Jul 25 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
electron实现qq快捷登录的方法示例
Oct 22 Javascript
js form表单input框限制20个字符,10个汉字代码实例
Apr 12 Javascript
浅谈vue中resetFields()使用注意事项
Aug 12 Javascript
聊聊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学习之PHP表达式
2006/10/09 PHP
php PDO中文乱码解决办法
2009/07/20 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
新闻内页-JS分页
2006/06/07 Javascript
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
Cookie 小记
2010/04/01 Javascript
javascript打印输出json实例
2013/11/11 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python实现随机漫步功能
2018/07/09 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
python speech模块的使用方法
2020/09/09 Python
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
大学生入党思想汇报
2014/01/14 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
高三励志标语
2014/06/05 职场文书
委托证明范本
2014/11/25 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python