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的图片轮播 tab切换组件
Jul 19 Javascript
浅析JavaScript原型继承的陷阱
Dec 03 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
JS和canvas实现俄罗斯方块
Mar 14 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
Vue项目中ESlint规范示例代码
Jul 04 Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 Javascript
django简单的前后端分离的数据传输实例 axios
May 18 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
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
理解javascript封装
2016/02/23 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
python实现DES加密解密方法实例详解
2015/06/30 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
安全资金保障制度
2014/01/23 职场文书
《风筝》教学反思
2014/04/10 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
2014年科技工作总结
2014/11/26 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书