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 相关文章推荐
FormValidate 表单验证功能代码更新并提供下载
Aug 23 Javascript
关于javascript document.createDocumentFragment()
Apr 04 Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
微信小程序 框架详解及实例应用
Sep 26 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
Three.js获取鼠标点击的三维坐标示例代码
Mar 24 Javascript
vue深入解析之render function code详解
Jul 18 Javascript
angularJs 表格添加删除修改查询方法
Feb 27 Javascript
VUE 全局变量的几种实现方式
Aug 22 Javascript
JavaScript寄生组合式继承原理与用法分析
Jan 11 Javascript
JavaScript实现Tab选项卡切换
Feb 13 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的access操作类
2008/04/09 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
JavaScript多图片上传案例
2015/09/28 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Python下简易的单例模式详解
2019/04/08 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
python程序如何进行保存
2020/07/03 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
初三开学计划书
2014/04/27 职场文书
家属慰问信
2015/02/14 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android