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 相关文章推荐
Add a Table to a Word Document
Jun 15 Javascript
jquery.validate分组验证代码
Mar 17 Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
Sep 22 Javascript
Array栈方法和队列方法的特点说明
Jan 24 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
js 轮播效果实例分享
Dec 28 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
Jan 08 jQuery
如何测量vue应用运行时的性能
Jun 21 Javascript
es6中比较有用的7个技巧小结
Jul 12 Javascript
Angular8 实现table表格表头固定效果
Jan 03 Javascript
ES6对象操作实例详解
May 23 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
js常用代码段整理
2011/11/30 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
javascript数组排序汇总
2015/07/07 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
Python字符串格式化的方法(两种)
2017/09/19 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
python Xpath语法的使用
2020/11/26 Python
艺术设计专业个人求职信范文
2013/12/11 职场文书
员工离职通知函
2015/04/25 职场文书
学生犯错保证书
2015/05/09 职场文书
律政俏佳人观后感
2015/06/09 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android