Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录

  • 前言
  • 功能预览
  • 样式特点总结:
    • 1. 整体视觉风格
    • 2. 密码输入框设计
    • 3. 强度指示条
    • 4. 结果文本与原因说明
  • 功能特点总结:
    • 1. 密码强度检测
    • 2. 实时反馈机制
    • 3. 详细原因说明
    • 4. 视觉提示
    • 5. 交互体验优化
  • 密码强度检测逻辑
  • Html代码
  • Javascript代码

前言

能满足等级保护测评要求的基本功能都实现了,可能还存在部分功能没有添加,密码强度验证逻辑可能还有需要强化的地方,有问题欢迎评论区讨论~

功能预览

在这里插入图片描述

在这里插入图片描述

样式特点总结:

1. 整体视觉风格

  • 使用深色主题背景,搭配线性渐变(从 #141E30#243B55),营造专业且现代的视觉效果。
  • 容器使用半透明黑色背景(rgba(0, 0, 0, 0.6)),边缘带有圆角(border-radius: 15px)和阴影效果(box-shadow),提升界面的层次感。

2. 密码输入框设计

  • 输入框采用无边框设计,背景色为浅灰色(rgba(255, 255, 255, 0.1)),聚焦时背景色变深(rgba(255, 255, 255, 0.2)),提供良好的交互反馈。
  • 输入框字体大小适中(font-size: 16px),占满容器宽度(width: 100%),确保良好的可用性。

3. 强度指示条

  • 强度指示条由三个彩色块组成(红色 #FF4136、黄色 #FFDC00、绿色 #2ECC40),每个块的高度固定(height: 10px),宽度随强度变化。
  • 使用过渡效果(transition: width 0.3s ease)使颜色块变化平滑。
  • 未激活的块设置为低透明度(.hidden { opacity: 0.2; }),增强视觉层次。

4. 结果文本与原因说明

  • 结果文字根据强度不同显示不同颜色(弱:红色;中:黄色;强:绿色)。
  • 原因说明部分使用无序列表展示具体原因,左侧带有项目符号(list-style-type: disc),排版清晰易读。

功能特点总结:

1. 密码强度检测

  • 检测密码的长度(最低要求 8 位)、字符类型(大写/小写字母、数字、特殊字符)以及是否存在安全隐患(如连续数字、重复字符、键盘规律等)。
  • 提供三种强度评级:弱(Weak)、中(Medium)、强(Strong),并实时更新结果。

2. 实时反馈机制

  • 在用户输入过程中,实时检测密码强度并更新界面显示。
  • 当密码为空时,提示用户“请输入密码”。

3. 详细原因说明

  • 对于强度较弱或中等的密码,显示具体原因(如“密码长度不足8位”、“包含连续数字”等),帮助用户改进密码。

4. 视觉提示

  • 使用颜色块动态展示密码强度,直观明了。
  • 不同强度对应不同的颜色和提示信息,便于用户快速理解结果。

5. 交互体验优化

  • 输入框聚焦时背景色变化,提供良好的交互反馈。
  • 原因说明部分使用无序列表,排版清晰,易于阅读。

密码强度检测逻辑

这个密码强度检测工具的核心逻辑主要集中在 checkPasswordStrength 函数中。以下是详细的逻辑总结:


  1. 基础条件检测
    密码强度检测基于以下基础条件:
  • 密码长度:密码长度必须至少为 8 位。
  • 字符类型:密码必须包含以下至少两种字符类型:
    • 大写字母(A-Z)
    • 小写字母(a-z)
    • 数字(0-9)
    • 特殊字符(非字母数字字符)

  1. 安全性检查
    密码强度检测还包括以下安全性检查:
  • 连续数字:检测密码中是否包含连续的数字序列(例如 123456 等)。
  • 重复字符:检测密码中是否存在重复的字符(例如 aabb 等)。
  • 键盘规律:检测密码是否符合常见的键盘输入规律(例如 qwe123asdf 等)。
  • 跨行键盘规律:检测密码是否符合跨行键盘输入规律(例如 qazwsx 等)。

  1. 强度评级规则
    根据上述条件,密码强度分为以下三个等级:

  2. 弱(Weak):

    • 密码长度不足 8 位。
    • 密码仅包含两种或更少字符类型。
    • 密码存在连续数字、重复字符或符合键盘输入规律。
    • 密码缺少特殊字符。
  3. 中(Medium):

    • 密码长度达到 8 位以上。
    • 密码包含三种字符类型。
    • 密码不存在明显的安全风险(如连续数字、重复字符或键盘规律)。
  4. 强(Strong):

    • 密码长度达到 8 位以上。
    • 密码包含四种字符类型(大写字母、小写字母、数字、特殊字符)。
    • 密码不存在连续数字、重复字符或键盘规律。

  1. 详细逻辑流程
    以下是 checkPasswordStrength 函数的详细逻辑流程:

  2. 初始检查:

    • 如果密码为空,返回“请输入密码”的提示信息。
  3. 字符类型检测:

    • 检查密码是否包含大写字母、小写字母、数字和特殊字符,并记录包含的字符类型。
  4. 安全性检查:

    • 使用正则表达式检测密码中是否存在连续数字(SEQUENTIAL_NUMBER_REGEX)。
    • 使用正则表达式检测密码中是否存在重复字符(REPEATED_CHARS_REGEX)。
    • 使用正则表达式检测密码中是否存在键盘规律(KEYBOARD_REGEX)。
    • 检查密码是否符合跨行键盘规律(通过 keyboardLayoutIndexeskeyboardLayout 实现)。
  5. 强度评级:

    • 如果密码长度不足 8 位或存在明显安全风险(如连续数字、重复字符或键盘规律),评级为“弱”。
    • 如果密码包含三种字符类型且不存在明显安全风险,评级为“中”。
    • 如果密码包含四种字符类型且不存在任何安全风险,评级为“强”。
  6. 结果反馈:

    • 返回密码强度评级和具体原因(例如“密码强度:弱”、“密码长度不足8位”等)。

Html代码

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><title>密码强度检测</title><style>body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;margin: 0;padding: 0;background: linear-gradient(to bottom right, #141E30, #243B55);color: #e0e0e0;display: flex;justify-content: center;align-items: center;min-height: 100vh;}.container {background-color: rgba(0, 0, 0, 0.6);padding: 40px;border-radius: 15px;box-shadow: 0 0 20px rgba(0, 0, 0, 0.8);width: 400px;}h1 {color: #e0e0e0;text-align: center;margin-bottom: 30px;font-size: 28px;}/* 密码输入框样式 */.password-input {width: 100%;padding: 15px;margin-bottom: 20px;border: none;border-radius: 8px;box-sizing: border-box;background-color: rgba(255, 255, 255, 0.1);color: #e0e0e0;font-size: 16px;outline: none;transition: background-color 0.3s ease;}.password-input:focus {background-color: rgba(255, 255, 255, 0.2);}.strength-meter {height: 10px;width: 100%;background-color: rgba(255, 255, 255, 0.1);border-radius: 10px;margin-bottom: 20px;overflow: hidden;display: flex;}.strength-bar {height: 100%;transition: width 0.3s ease, background-color 0.3s ease;width: 33.33%;}.strength-bar:nth-child(1) {background-color: #FF4136; }.strength-bar:nth-child(2) {background-color: #FFDC00; }.strength-bar:nth-child(3) {background-color: #2ECC40; }.strength-bar.hidden {opacity: 0.2;}.result-text {margin-bottom: 10px;font-weight: bold;font-size: 18px;text-align: center;}.weak-text {color: #FF4136;}.medium-text {color: #FFDC00;}.strong-text {color: #2ECC40;}.reasons {margin-top: 20px;}.reasons p {margin-bottom: 10px;font-size: 16px;}.reasons ul {list-style-type: disc;padding-left: 20px;font-size: 14px;}</style>
</head><body><div class="container"><h1>密码强度检测</h1><input type="password" class="password-input" placeholder="请输入密码"><div class="strength-meter"><div class="strength-bar hidden"></div><div class="strength-bar hidden"></div><div class="strength-bar hidden"></div></div><div class="result-text"></div><div class="reasons"></div></div>
</body></html>

Javascript代码

<script>const passwordInput = document.querySelector('.password-input');const strengthBars = document.querySelectorAll('.strength-bar');const resultText = document.querySelector('.result-text');const reasonsDiv = document.querySelector('.reasons');const MIN_PASSWORD_LENGTH = 8;const SEQUENTIAL_NUMBER_REGEX = /(?:012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210)/;const REPEATED_CHARS_REGEX = /([a-zA-Z])\1/i;const keyboardLayout = ['`1234567890-=','qwertyuiop[]\\','asdfghjkl;\'','zxcvbnm,./'].join('');const keyboardLayoutIndexes = {};for (let i = 0; i < keyboardLayout.length; i++) {keyboardLayoutIndexes[keyboardLayout[i]] = i;}// 键盘规律正则表达式const keyboardPatterns = [// 单行规律 'qwe', 'wer', 'ert', 'rty', 'tyu', 'yui', 'uio', 'iou','asd', 'sdf', 'dfg', 'fgh', 'ghj', 'hjk', 'jkl','zxc', 'xcv', 'cvb', 'vbn',// 符号键盘 '!@#', '@#$', '#$%', '$%^', '%^&', '^&*', '&*(','!qwe', '@wsx', '#edc', '$rfv', '%tgb', '^yhn', '&ujm', '*k,',// 数字键盘 '123', '234', '345', '456', '567', '678', '789','987', '876', '765', '654', '543', '432', '321','147', '258', '369',// 跨行规律 'qaz', 'wsx', 'edc', 'rfv', 'tgb', 'yhn', 'ujm', 'k\\.,','QAZ', 'WSX', 'EDC', 'RFV', 'TGB', 'YHN', 'UJM', 'K\\.,',// 符号+字母跨行 '!qaz', '@wsx', '#edc', '$rfv', '%tgb', '^yhn', '&ujm', '*k,','!QAZ', '@WSX', '#EDC', '$RFV', '%TGB', '^YHN', '&UJM', '*K,',// 数字+字母跨行 '1qaz', '2wsx', '3edc', '4rfv', '5tgb', '6yhn', '7ujm', '8k,','1QAZ', '2WSX', '3EDC', '4RFV', '5TGB', '6YHN', '7UJM', '8K.',// 添加大小写混合的情况'1QaZ', '2WsX', '3EdC', '4RfV', '5TgB', '6YhN', '7UjM', '8K.','!QaZ', '@WsX', '#EdC', '$RfV', '%TgB', '^YhN', '&UjM', '*K,'];const regexPatterns = keyboardPatterns.map(pattern => pattern.replace(/([.*+?^${}() |[\]\\])/g, '\\$1'));const KEYBOARD_REGEX = new RegExp(regexPatterns.join('|'), 'i');function checkPasswordStrength(password) {if (!password) {return { strength: 'empty', reasons: ['请输入密码'] };}const hasUpperCase = /[A-Z]/.test(password);const hasLowerCase = /[a-z]/.test(password);const hasNumbers = /\d/.test(password);const hasSpecialChars = /[^a-zA-Z\d]/.test(password);const charTypes = [];if (hasUpperCase) charTypes.push(' 大写字母');if (hasLowerCase) charTypes.push(' 小写字母');if (hasNumbers) charTypes.push(' 数字');if (hasSpecialChars) charTypes.push(' 特殊字符');const hasSequentialNumbers = SEQUENTIAL_NUMBER_REGEX.test(password);const hasRepeatedChars = REPEATED_CHARS_REGEX.test(password);const hasKeyboardPattern = KEYBOARD_REGEX.test(password);function hasSequentialKeyboardKeys(password) {for (let i = 0; i < password.length - 2; i++) {const charIndex = keyboardLayoutIndexes[password[i].toLowerCase()];const nextIndex = keyboardLayoutIndexes[password[i + 1].toLowerCase()];const nextNextIndex = keyboardLayoutIndexes[password[i + 2].toLowerCase()];if (nextIndex === charIndex + 1 && nextNextIndex === nextIndex + 1) {return true;}}return false;}const reasons = [];if (password.length < MIN_PASSWORD_LENGTH) {reasons.push(' 密码长度不足8位');}if (hasSequentialNumbers) {reasons.push(' 包含连续数字');}if (hasRepeatedChars) {reasons.push(' 包含重复字符');}if (hasKeyboardPattern || hasSequentialKeyboardKeys(password)) {reasons.push(' 符合键盘输入规律');}if (!hasSpecialChars) {reasons.push(' 缺少特殊字符');}let strength;if ((charTypes.length <= 2 && password.length >= MIN_PASSWORD_LENGTH) ||reasons.length > 1 ||hasSequentialKeyboardKeys(password)) {strength = 'weak';reasons.unshift(' 密码强度:弱');} else if (charTypes.length === 4 &&!hasKeyboardPattern &&!hasSequentialNumbers &&!hasRepeatedChars &&!hasSequentialKeyboardKeys(password)) {strength = 'strong';reasons.unshift(' 密码强度:强');} else {strength = 'medium';reasons.unshift(' 密码强度:中');}return { strength, reasons };}document.addEventListener('input', function (event) {if (event.target === passwordInput) {const result = checkPasswordStrength(event.target.value);strengthBars.forEach((bar, index) => {if (result.strength === 'weak') {if (index === 0) {bar.classList.remove('hidden');} else {bar.classList.add('hidden');}} else if (result.strength === 'medium') {if (index < 2) {bar.classList.remove('hidden');} else {bar.classList.add('hidden');}} else if (result.strength === 'strong') {bar.classList.remove('hidden');} else {bar.classList.add('hidden');}});if (result.strength === 'empty') {resultText.innerHTML = '';reasonsDiv.innerHTML = '';return;}resultText.className = `${result.strength}-text`;resultText.innerHTML = result.reasons[0];if (result.strength === 'weak' || result.strength === 'medium') {reasonsDiv.innerHTML = `<p>原因:</p><ul>${result.reasons.slice(1).map(r => `<li>${r}</li>`).join('')}</ul>`;} else {reasonsDiv.innerHTML = '';}}});</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能车摄像头开源—8 元素处理

目录 一、前言 二、无元素状态 三、直线与弯道 四、十字与环岛 1、十字识别处理 2、环岛识别处理 五、坡道 六、障碍物 七、斑马线 八、入库 九、出界停车 一、前言 在写这篇文章之前&#xff0c;考虑了很久到底该写到什么程度&#xff0c;但思来想去&#xff0c;不同…

微信服务号推送消息

这里如果 没有 就需要点新的功能去申请一下 申请成功之后就可以设置模版消息 推送到用户接受的页面是 需要后端调用接口 传递token 发送给客户

matlab汽车动力学半车垂向振动模型

1、内容简介 matlab141-半车垂向振动模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

1-10 github注册仓库

如何在github中注册一个仓库&#xff1f; 1.0 注册仓库 1-1 GitHub的账号注册教程_github注册-CSDN博客 2.0 删除仓库 1-2 从github中删除创建的仓库_github删除仓库-CSDN博客 3.0 创建仓库 1-3 【教程】GitHub新建仓库新手教程_github仓库-CSDN博客 4.0 github操作 1-4 1-9 克…

EasyRTC智能硬件:小体积,大能量,开启音视频互动新体验

在万物互联的时代&#xff0c;智能硬件正以前所未有的速度融入我们的生活。然而&#xff0c;受限于硬件性能和网络环境&#xff0c;许多智能硬件在音视频互动体验上仍存在延迟高、卡顿、回声等问题&#xff0c;严重影响了用户的使用体验。 EasyRTC智能硬件&#xff0c;凭借其强…

PHP 面向对象编程

PHP 学习资料 PHP 学习资料 PHP 学习资料 在 PHP 编程领域&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一种强大的编程范式&#xff0c;它提供了更高效的代码组织和复用方式&#xff0c;使程序的结构更清晰、易维护。接下来&#xff0c;我们将深入探讨 PHP 面向对…

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…

matlab飞行姿态pid控制

1、内容简介 matlab139-飞行姿态pid控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

easyexcel快速使用

1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作&#xff0c; 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…

网络基础 【UDP、TCP】

1.UDP 首先我们学习UDP和TCP协议 要从这三个问题入手 1.报头和有效载荷如何分离、有效载荷如何交付给上一层的协议&#xff1f;2.认识报头3.学习该协议周边的问题 UDP报头 UDP我们先从示意图来讲解&#xff0c;认识报头。 UDP协议首部有16位源端口号&#xff0c;16位目的端…

基于SpringBoot的医院药房管理系统【源码+答辩PPT++项目部署】高质量论文1-1.5W字

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF&#xff08;位姿&#xff1a;6 Degrees of Freedom&#xff09;姿态 的方法&#xff0c;包括平移和平面旋转。它在目标检测、机器人视觉、增强现实&#xff08;AR&#xff09;和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明&#xff1a; 一、Nginx 的核心功能 1. 静态资源服务 功能&#xff1a;直接返回静态文件&#xff08;如 HTML、CSS、JS、图片、视频等&#xff09;。配置示例&#xff1a;server {listen 80…

Java语言介绍

Java是一种广泛使用的计算机编程语言&#xff0c;拥有跨平台、面向对象、泛型编程的特性&#xff0c;广泛应用于企业级Web应用开发和移动应用开发。任职于Sun微系统的詹姆斯高斯林等人于1990年代初开发Java语言的雏形&#xff0c;最初被命名为Oak&#xff0c;目标设置在家用电器…

shell——分支语句

文章目录 基本语法常用判断条件(1)两个整数之间比较&#xff08;2&#xff09;按照文件权限进行判断&#xff08;3&#xff09;按照文件类型进行判断&#xff08;4&#xff09;多条件判断&#xff08;&& 表示前一条命令执行成功时&#xff0c;才执行后一条命令&#xf…

细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法

目录 一、入侵检测的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6、KEYLED 2、RTC &#xff08;1&#xff09;设置RTC的模式。 &#xff08;2&#xff09;General、Time、Date\Wake Up分组 &#xff08;3&#xff09;Tamper分组 1&#xff…

Python elasticsearch客户端连接常见问题整理

python 访问 elasticsearch 在python语言中&#xff0c;我们一般使用 pip install elasticsearch 软件包&#xff0c;来访问es服务器。 正确用法 本地安装elasticsearch时&#xff0c;应指定与服务端相同的大版本号&#xff1a; pip install elasticsearch7.17.0然后就可以…

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴&#xff08;Huawei Authorized Learning Partner&#xff0c;简称HALP&#xff09;是获得华为授权&#xff0c;面向公众&#xff08;主要为华为企业业务的伙伴/客户&#xff09;提供与华为产品和技术相关的培训服务&#xff0c;培养华为产业链所…

python的类装饰器

装饰器不仅可以用于函数&#xff0c;还能作用于类。将装饰器应用于类时&#xff0c;其核心原理与作用于函数类似&#xff0c;都是通过接收一个类作为输入&#xff0c;然后返回一个新的类或者修改后的原类&#xff0c;以此来为类添加额外的功能 简单的类装饰器 def add_method…

MySQL数据库的设计原则

前言 首先&#xff0c;数据库设计原则通常包括范式化、性能优化、安全性等方面。但具体到MySQL&#xff0c;可能还有一些特定的最佳实践。例如&#xff0c;存储引擎的选择&#xff08;InnoDB vs MyISAM&#xff09;、索引的使用、事务处理等。 1.范式化的内容。   第一范式是…