密码强度测试工具包【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();
  }
}


相关文章
|
17天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(十二)-java+ selenium自动化测试-元素定位大法之By link text(详细教程)
【4月更文挑战第4天】本文介绍了link text在自动化测试中的应用。Link text是指网页中链接的文字描述,点击可跳转至其他页面。文章列举了8种常用的定位方法,其中着重讲解了link text定位,并通过实例展示了如何使用Java代码实现点击百度首页的“奥运奖牌榜 最新排名”链接,进入相应页面。如果link text不准确,则无法定位到元素,这说明linkText是精准匹配,而非模糊匹配。文章还提到了partial link text作为link text的模糊匹配版本,将在后续内容中介绍。
36 4
|
15天前
|
Java 测试技术
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
18 0
|
12天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
33 3
|
15天前
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
【4月更文挑战第6天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
43 0
|
Java 测试技术
Java 中的单元测试和集成测试策略
【4月更文挑战第19天】本文探讨了Java开发中的单元测试和集成测试。单元测试专注于单一类或方法的功能验证,使用测试框架如JUnit,强调独立性、高覆盖率和及时更新测试用例。集成测试则验证模块间交互,通过逐步集成或模拟对象来检测系统整体功能。两者相辅相成,确保软件质量和降低修复成本。
|
4天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)
【4月更文挑战第17天】其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇。那是因为这个比较重要,所以宏哥专门为她量身定制了一篇。FluentWait是Selenium中功能强大的一种等待方式,翻译成中文是流畅等待的意思。在介绍FluentWait之前,我们来讨论下为什么需要设置等待,我们前面介绍了隐式等待和显式等待。
27 3
|
6天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
27 0
|
9天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(十九)-java+ selenium自动化测试-元素定位大法之By css下卷(详细教程)
【4月更文挑战第11天】按计划今天宏哥继续讲解css的定位元素的方法。但是今天最后一种宏哥介绍给大家,了解就可以了,因为实际中很少用。
34 2
|
11天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(十八)-java+ selenium自动化测试-元素定位大法之By css中卷(详细教程)
【4月更文挑战第10天】本文主要介绍了CSS定位元素的几种方法,包括ID属性值定位、其他属性值定位和使用属性值的一部分定位。作者提供了示例代码,展示了如何使用这些方法在Java+Selenium自动化测试中定位网页元素。通过CSS选择器,可以更精确地找到页面上的特定元素,如输入框、按钮等,并进行相应的操作,如输入文本、点击等。文章还提供了实际运行代码后的控制台输出和浏览器动作的示例。
47 0
|
12天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)
【4月更文挑战第9天】本文介绍了CSS定位方式的使用,包括它的优势和8种常用的定位方法。CSS定位相比XPath定位更快、更稳定。文章通过示例详细讲解了如何使用CSS定位元素,包括通过id、name、class name、tag name、link text、partial link text以及XPath进行定位。还提供了Java代码示例来演示如何在自动化测试中使用这些定位方法。
39 1