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的caller,callee,call,apply
Apr 28 Javascript
JavaScript 组件之旅(二)编码实现和算法
Oct 28 Javascript
Javascript中的window.event.keyCode使用介绍
Apr 26 Javascript
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
微信小程序实现的自定义分享功能示例
Feb 12 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
js正则表达式简单校验方法
Jan 03 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
Python开发编码规范
2006/09/08 Python
Python中的pprint折腾记
2015/01/21 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
tensorflow之并行读入数据详解
2020/02/05 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
北京某公司的.net笔试题
2014/03/20 面试题
留学自荐信的技巧
2013/10/17 职场文书
中专毕业生自荐信
2013/11/16 职场文书
建国大业观后感800字
2015/06/01 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
python执行js代码的方法
2021/05/13 Python
MySQL创建管理RANGE分区
2022/04/13 MySQL