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 相关文章推荐
使用jquery给input和textarea设定ie中的focus
May 29 Javascript
JS+CSS实现简易的滑动门效果代码
Sep 24 Javascript
js实现跨域的多种方法
Dec 25 Javascript
vue多级多选菜单组件开发
Sep 08 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
vue中用H5实现文件上传的方法实例代码
May 27 Javascript
详解JavaScript中的强制类型转换
Apr 15 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
微信小程序入门之指南针
Oct 22 Javascript
微信小程序APP页面的之间的相互传递参数以及自定义组件
Apr 19 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
php导出excel格式数据问题
2014/03/11 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP实现微信对账单处理
2018/10/01 PHP
PHP反射学习入门示例
2019/06/14 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
简化Python的Django框架代码的一些示例
2015/04/20 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
深入了解python中元类的相关知识
2019/08/29 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
医学院学生求职简历的自我评价
2013/10/24 职场文书
教师师德教育的自我评价
2013/10/31 职场文书
房屋继承公证书
2014/04/10 职场文书
2015年防汛工作总结
2015/05/15 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
MySQL视图概念以及相关应用
2022/04/19 MySQL
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技