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 相关文章推荐
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
Nov 30 Javascript
JavaScript动态调整TextArea高度的代码
Dec 28 Javascript
基于jquery的无限级联下拉框js插件
Oct 29 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
Node.js中调用mysql存储过程示例
Dec 20 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
JS实现合并json对象的方法
Oct 10 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 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实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
提高PHP编程效率的方法
2013/11/07 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
学习python需要有编程基础吗
2020/06/02 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
生日宴会答谢词
2014/01/09 职场文书
狼和鹿教学反思
2014/02/05 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
感恩节活动策划方案
2014/05/16 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
努力学习保证书
2015/02/26 职场文书
寒假安全保证书
2015/02/28 职场文书
匿名信格式范文
2015/05/27 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python