前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >密码强度测试工具包【Java】_测试用例

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

作者头像
红目香薰
发布2022-11-29 17:45:47
1.1K0
发布2022-11-29 17:45:47
举报
文章被收录于专栏:CSDNToQQCode

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

例如:

7418520*963.-+

综合得分:

128分。

具体编码: 

代码语言:javascript
复制
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();
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档