密码强度测试工具包【Java】_测试用例

简介: 密码强度测试工具包【Java】_测试用例

密码强度测试工具,Java版本,直接运行即可。


例如:


7418520*963.-+


综合得分:

32.png


128分。


具体编码:

package Action;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 密码最低要求8字符<br/>
 * 最少符合下列四项中三项规则: 大写英文字符、小写英文字符、数字、符号<br/>
 * 
 * 增加字符的变化能提高强度<br/>
 * 最后的分数为加分减分之后的sum总和<br/>
 */
public class PassWord {
  private String psw;
  private int length;// 密码长度
  private int upperAlp = 0;// 大写字母长度
  private int lowerAlp = 0;// 小写字母长度
  private int num = 0;// 数字长度
  private int charlen = 0;// 特殊字符长度
  /**
   * 测试主函数
   * @param args
   */
  public static void main(String[] args) {
    PassWord pwd=new PassWord("7418520*963.-+");
    int jiafen = pwd.jiafen();
    int jianfen = pwd.jianfen();
    System.out.println("加分合计:"+jiafen+"分");
    System.out.println("减分合计:"+jianfen+"分");
    System.out.println("总计得分:"+(jiafen+jianfen)+"分");
  }
  /**
   * new的时候直接传递参数用
   * @param psw
   */
  public PassWord(String psw) {
    this.psw = psw.replaceAll("\\s", "");
    this.length = psw.length();
  }
  // 密码长度积分
  public int CheckPswLength() {
    return this.length * 4;
  }
  // 大写字母积分
  public int CheckPswUpper() {
    String reg = "[A-Z]";
    Pattern pattern = Pattern.compile(reg);
    Matcher matcher = pattern.matcher(psw);
    int j = 0;
    while (matcher.find()) {
      j++;
    }
    this.upperAlp = j;
    if (j <= 0) {
      return 0;
    }
    return (this.length - j) * 2;
  }
  // 测试小写字母字符
  public int CheckPwsLower() {
    String reg = "[a-z]";
    Pattern pattern = Pattern.compile(reg);
    Matcher matcher = pattern.matcher(this.psw);
    int j = 0;
    while (matcher.find()) {
      j++;
    }
    this.lowerAlp = j;
    if (j <= 0) {
      return 0;
    }
    return (this.length - j) * 2;
  }
  // 测试数字字符
  public int checkNum() {
    String reg = "[0-9]";
    Pattern pattern = Pattern.compile(reg);
    Matcher matcher = pattern.matcher(this.psw);
    int j = 0;
    while (matcher.find()) {
      j++;
    }
    this.num = j;
    if (this.num == this.length) {
      return 0;
    }
    return j * 4;
  }
  // 测试符号字符
  public int checkChar() {
    charlen = this.length - this.upperAlp - this.lowerAlp - this.num;
    return this.charlen * 6;
  }
  /**
   * 密码中间穿插数字或符号
   * 
   * @return
   */
  public int checkNumOrCharInStr() {
    int j = this.num + this.charlen - 1;
    if (j < 0) {
      j = 0;
    }
    if (this.num + this.charlen == this.length) {
      j = this.length - 2;
    }
    return j * 2;
  }
  /**
   * 最低要求标准<br/>
   * 该方法需要在以上加分方法使用后才可以使用
   * 
   * @return
   */
  public int LowerQuest() {
    int j = 0;
    if (this.length >= 8) {
      j++;
    }
    if (this.upperAlp > 0) {
      j++;
    }
    if (this.lowerAlp > 0) {
      j++;
    }
    if (this.num > 0) {
      j++;
    }
    if (this.charlen > 0) {
      j++;
    }
    if (j >= 4) {
    } else {
      j = 0;
    }
    return j * 2;
  }
  /** =================分割线===扣分项目===================== **/
  // 只包含英文字母
  public int OnlyHasAlp() {
    if (this.length == (this.upperAlp + this.lowerAlp)) {
      return -this.length;
    }
    return 0;
  }
  // 只包含数字
  public int OnlyHasNum() {
    if (this.length == this.num) {
      return -this.length;
    }
    return 0;
  }
  // 重复字符扣分
  public int repeatDex() {
    char[] c = this.psw.toLowerCase().toCharArray();
    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (int i = 0; i < c.length; i++) {
      if (hashMap.containsKey(c[i])) {
        hashMap.put(c[i], hashMap.get(c[i]) + 1);
      } else {
        hashMap.put(c[i], 1);
      }
    }
    int sum = 0;
    Iterator<Entry<Character, Integer>> iterator = hashMap.entrySet().iterator();
    while (iterator.hasNext()) {
      int j = iterator.next().getValue();
      if (j > 0) {
        sum = sum + j * (j - 1);
      }
    }
    return -sum;
  }
  // 连续英文大写字符
  public int seriseUpperAlp() {
    int j = 0;
    char[] c = this.psw.toCharArray();
    for (int i = 0; i < c.length - 1; i++) {
      if (Pattern.compile("[A-Z]").matcher(c[i] + "").find()) {
        if (Pattern.compile("[A-Z]").matcher(c[i + 1] + "").find()) {
          j++;
        }
      }
    }
    return -2 * j;
  }
  // 连续英文小写字符
  public int seriseLowerAlp() {
    String reg = "[a-z]";
    int j = 0;
    char[] c = this.psw.toCharArray();
    for (int i = 0; i < c.length - 1; i++) {
      if (Pattern.compile(reg).matcher(c[i] + "").find() && c[i] + 1 == c[i + 1]) {
        j++;
      }
    }
    return -2 * j;
  }
  // 连续数字字符
  public int seriseNum() {
    String reg = "[0-9]";
    Pattern pattern = Pattern.compile(reg);
    char[] c = this.psw.toCharArray();
    int j = 0;
    for (int i = 0; i < c.length - 1; i++) {
      if (pattern.matcher(c[i] + "").matches() && pattern.matcher(c[i + 1] + "").matches()) {
        j++;
      }
    }
    return -2 * j;
  }
  // 连续字母abc def之类超过3个扣分 不区分大小写字母
  public int seriesAlp2Three() {
    int j = 0;
    char[] c = this.psw.toLowerCase(Locale.CHINA).toCharArray();
    for (int i = 0; i < c.length - 2; i++) {
      if (Pattern.compile("[a-z]").matcher(c[i] + "").find()) {
        if ((c[i + 1] == c[i] + 1) && (c[i + 2] == c[i] + 2)) {
          j++;
        }
      }
    }
    return -3 * j;
  }
  // 连续数字123 234之类超过3个扣分
  public int seriesNum2Three() {
    int j = 0;
    char[] c = this.psw.toLowerCase(Locale.CHINA).toCharArray();
    for (int i = 0; i < c.length - 2; i++) {
      if (Pattern.compile("[0-9]").matcher(c[i] + "").find()) {
        if ((c[i + 1] == c[i] + 1) && (c[i + 2] == c[i] + 2)) {
          j++;
        }
      }
    }
    return -3 * j;
  }
  public int jiafen() {
    System.out.println("密码字符=" + CheckPswLength());
    System.out.println("大写英文字符=" + CheckPswUpper());
    System.out.println("小写英文字符=" + CheckPwsLower());
    System.out.println("数字字符=" + checkNum());
    System.out.println("符号字符=" + checkChar());
    System.out.println("密码中间查查数字或符号字符=" + checkNumOrCharInStr());
    System.out.println("已连密码最低要求项目=" + LowerQuest());
    return CheckPswLength()+CheckPswUpper()+CheckPwsLower()+checkNum()+checkChar()+checkNumOrCharInStr()+LowerQuest();
  }
  public int jianfen() {
    System.out.println("只有英文字符=" + OnlyHasAlp());
    System.out.println("只有数字字符=" + OnlyHasNum());
    System.out.println("重复字符 (Case Insensitive)=" + repeatDex());
    System.out.println("重复英文大写字符=" + seriseUpperAlp());
    System.out.println("重复英文小写字符=" + seriseLowerAlp());
    System.out.println("连续数字字符=" + seriseNum());
    System.out.println("连续字母超过三个(如abc,def)=" + seriesAlp2Three());
    System.out.println("连续数字超过三个(如123,234)=" + seriesNum2Three());
    return OnlyHasAlp()+OnlyHasNum()+repeatDex()+seriseUpperAlp()+seriseLowerAlp()+seriseNum()+seriesAlp2Three()+seriesNum2Three();
  }
}


相关文章
|
4月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
495 0
|
8月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
9月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
5月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
223 0
|
5月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
8月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
1043 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
10月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
817 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
9月前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
407 17
|
11月前
|
存储 测试技术 数据库
接口测试工具攻略:轻松掌握测试技巧
在互联网快速发展的今天,软件系统的复杂性不断增加,接口测试工具成为确保系统稳定性的关键。它如同“翻译官”,模拟请求、解析响应、验证结果、测试性能并支持自动化测试,确保不同系统间信息传递的准确性和完整性。通过Apifox等工具,设计和执行测试用例更加便捷高效。接口测试是保障系统稳定运行的第一道防线。
|
11月前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。