Android Java判断密码强度 强度显示

定风波 苏轼(宋)

三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。

莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。

1,正则表达式

密码强度的正则表达式

    public static final String WEAK_PATTERN = "(^(?=.*[0-9])(?=.*[a-z])[0-9a-z]{6,18}$)|(^(?=.*[0-9])(?=.*[A-Z])[0-9A-Z]{6,18}$)";//全数字+字母(大/小)
    public static final String MEDIUM_PATTERN = "((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,18})|((?=.*[0-9])(?=.*[a-z])(?=.*[^\\w\\s]).{6,18})|((?=.*[0-9])(?=.*[A-Z])(?=.*[^\\w\\s]).{6,18})";//数字+字母(大+小)/数字+小+特殊字符/数字+大+特殊字符
    public static final String STRONG_PATTERN = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^\\w\\s]).{6,18}";//数字+字母(大+小)+特殊字符

我们定义密码至少有数字和字母,且最少6位最多18位,按照密码强弱层度分成了弱中强三种情况。

弱:是数字+字母(大/小),此时的字母要么全是大写,要么全是小写

中:数字+字母(大+小)/数字+小+特殊字符/数字+大+特殊字符,情况比较多分为三种情况     :

  1.              数字+字母(大写+小写):此时字母大小写同时存在
  2.             数字+小+特殊字符:数字+小写字母+特殊字符(比如@、¥、*等)的组合
  3.             数字+大+特殊字符:数字+大写字母+特殊字符的组合

强:数字+字母(大+小)+特殊字符,数字+字母大小写同时存在+特殊字符,最强密码

解析正则表达式

WEAK_PATTERN

(                           // 开始第一个正则表达式组
    ^                       // 匹配字符串的开始位置
    (?=.*[0-9])             // 正向先行断言,匹配至少一个数字
    (?=.*[a-z])             // 正向先行断言,匹配至少一个小写字母
    [0-9a-z]{6,18}          // 匹配6-18个数字或小写字母的组合
    $                       // 匹配字符串的结束位置
)                           // 结束第一个正则表达式组
|                           // 或
(                           // 开始第二个正则表达式组
    ^                       // 匹配字符串的开始位置
    (?=.*[0-9])             // 正向先行断言,匹配至少一个数字
    (?=.*[A-Z])             // 正向先行断言,匹配至少一个大写字母
    [0-9A-Z]{6,18}          // 匹配6-18个数字或大写字母的组合
    $                       // 匹配字符串的结束位置
)                           // 结束第二个正则表达式组

该正则表达式包含两个正则表达式组,用 | 进行分隔,表示匹配两种不同的密码格式,分别为:

  • 至少包含一个数字和一个小写字母的6-18位密码;
  • 至少包含一个数字和一个大写字母的6-18位密码。

每个正则表达式组都使用了正向先行断言,确保密码中至少包含指定的字符类型。然后使用字符集 [0-9a-z] 或 [0-9A-Z] 来匹配密码中的数字和字母。最后使用 {6,18} 来限制密码长度在6-18个字符之间,并使用 ^ 和 $ 分别表示匹配字符串的开始和结束位置。

MEDIUM_PATTERN

(                                   // 开始第一个正则表达式组
    (?=.*[0-9])                     // 正向先行断言,匹配至少一个数字
    (?=.*[a-z])                     // 正向先行断言,匹配至少一个小写字母
    (?=.*[A-Z])                     // 正向先行断言,匹配至少一个大写字母
    .{6,18}                         // 匹配6-18个任意字符
)                                   // 结束第一个正则表达式组
|                                   // 或
(                                   // 开始第二个正则表达式组
    (?=.*[0-9])                     // 正向先行断言,匹配至少一个数字
    (?=.*[a-z])                     // 正向先行断言,匹配至少一个小写字母
    (?=.*[^\w\s])                   // 正向先行断言,匹配至少一个非单词字符和非空白字符
    .{6,18}                         // 匹配6-18个任意字符
)                                   // 结束第二个正则表达式组
|                                   // 或
(                                   // 开始第三个正则表达式组
    (?=.*[0-9])                     // 正向先行断言,匹配至少一个数字
    (?=.*[A-Z])                     // 正向先行断言,匹配至少一个大写字母
    (?=.*[^\w\s])                   // 正向先行断言,匹配至少一个非单词字符和非空白字符
    .{6,18}                         // 匹配6-18个任意字符
)                                   // 结束第三个正则表达式组

该正则表达式包含三个正则表达式组,用 | 进行分隔,表示匹配三种不同的密码格式,分别为:

  • 包含数字、小写字母和大写字母的6-18位密码;
  • 包含数字、小写字母和非单词字符和非空白字符的6-18位密码;
  • 包含数字、大写字母和非单词字符和非空白字符的6-18位密码。

每个正则表达式组都使用了三个正向先行断言,确保密码中至少包含指定的字符类型。(?=.[0-9]) 表示密码中至少包含一个数字,(?=.[a-z]) 表示密码中至少包含一个小写字母,(?=.[A-Z]) 表示密码中至少包含一个大写字母,(?=.[^\w\s]) 表示密码中至少包含一个非单词字符和非空白字符。

最后使用 .{6,18} 来匹配密码中的任意字符,并限制密码长度在6-18个字符之间。

STRONG_PATTERN

(                           // 开始正则表达式组
    ?=.*[0-9]               // 正向先行断言,匹配至少一个数字
    (?=.*[a-z])             // 正向先行断言,匹配至少一个小写字母
    (?=.*[A-Z])             // 正向先行断言,匹配至少一个大写字母
    (?=.*[^\w\s])           // 正向先行断言,匹配至少一个非单词字符和非空白字符
    .{6,18}                 // 匹配6-18个任意字符
)                           // 结束正则表达式组

该正则表达式用于匹配包含数字、小写字母、大写字母和非单词字符和非空白字符的6-18位密码。

该正则表达式使用正向先行断言,确保密码中至少包含指定的字符类型。?=.*[0-9] 表示密码中至少包含一个数字,?=.*[a-z] 表示密码中至少包含一个小写字母,?=.*[A-Z] 表示密码中至少包含一个大写字母,?=.*[^\w\s] 表示密码中至少包含一个非单词字符和非空白字符。

最后使用 .{6,18} 来匹配密码中的任意字符,并限制密码长度在6-18个字符之间。

2,使用方法

    public static String checkStrength(String password) {
        if (Pattern.matches(STRONG_PATTERN, password)) {
            return "strong";
        }else if (Pattern.matches(MEDIUM_PATTERN, password)) {
            return "medium";
        } else if (Pattern.matches(WEAK_PATTERN, password)) {
            return "weak";
        }else {
            return "invalid";
        }
    }


    public static void main(String[] args) {
        while(true){
            Scanner scan = new Scanner(System.in);
            String password = scan.next();
            String strength = checkStrength(password);
            System.out.println("Password strength: " + strength);
        }
    }

测试结果

 3,项目中使用效果

 

猜你喜欢

转载自blog.csdn.net/qq_55888300/article/details/131295539