java实现的密码强度检测功能完整示例
本文实例讲述了java实现的密码强度检测功能。分享给大家供大家参考,具体如下:
CheckStrength.java文件:
packagecom.wx.pwd;
/**
*检测密码强度
*
*@authorvenshine
*/
publicclassCheckStrength{
publicenumLEVEL{
EASY,MIDIUM,STRONG,VERY_STRONG,EXTREMELY_STRONG
}
/**
*NUM数字
*SMALL_LETTER小写字母
*CAPITAL_LETTER大写字母
*OTHER_CHAR特殊字符
*/
privatestaticfinalintNUM=1;
privatestaticfinalintSMALL_LETTER=2;
privatestaticfinalintCAPITAL_LETTER=3;
privatestaticfinalintOTHER_CHAR=4;
/**
*简单的密码字典
*/
privatefinalstaticString[]DICTIONARY={"password","abc123","iloveyou","adobe123","123123","sunshine",
"1314520","a1b2c3","123qwe","aaa111","qweasd","admin","passwd"};
/**
*检查字符类型,包括num、大写字母、小写字母和其他字符。
*
*@paramc
*@return
*/
privatestaticintcheckCharacterType(charc){
if(c>=48&&c<=57){
returnNUM;
}
if(c>=65&&c<=90){
returnCAPITAL_LETTER;
}
if(c>=97&&c<=122){
returnSMALL_LETTER;
}
returnOTHER_CHAR;
}
/**
*按不同类型计算密码的数量
*
*@parampasswd
*@paramtype
*@return
*/
privatestaticintcountLetter(Stringpasswd,inttype){
intcount=0;
if(null!=passwd&&passwd.length()>0){
for(charc:passwd.toCharArray()){
if(checkCharacterType(c)==type){
count++;
}
}
}
returncount;
}
/**
*检查密码的强度
*
*@parampasswd
*@returnstrengthlevel
*/
publicstaticintcheckPasswordStrength(Stringpasswd){
if(StringUtils.equalsNull(passwd)){
thrownewIllegalArgumentException("passwordisempty");
}
intlen=passwd.length();
intlevel=0;
//增加点
//判断密码是否含有数字有level++
if(countLetter(passwd,NUM)>0){
level++;
}
//判断密码是否含有小写字母有level++
if(countLetter(passwd,SMALL_LETTER)>0){
level++;
}
//判断密码是否还有大写字母有level++
if(len>4&&countLetter(passwd,CAPITAL_LETTER)>0){
level++;
}
//判断密码是否还有特殊字符有level++
if(len>6&&countLetter(passwd,OTHER_CHAR)>0){
level++;
}
//密码长度大于4并且2种类型组合......(不一一概述)
if(len>4&&countLetter(passwd,NUM)>0&&countLetter(passwd,SMALL_LETTER)>0
||countLetter(passwd,NUM)>0&&countLetter(passwd,CAPITAL_LETTER)>0
||countLetter(passwd,NUM)>0&&countLetter(passwd,OTHER_CHAR)>0
||countLetter(passwd,SMALL_LETTER)>0&&countLetter(passwd,CAPITAL_LETTER)>0
||countLetter(passwd,SMALL_LETTER)>0&&countLetter(passwd,OTHER_CHAR)>0
||countLetter(passwd,CAPITAL_LETTER)>0&&countLetter(passwd,OTHER_CHAR)>0){
level++;
}
//密码长度大于6并且3中类型组合......(不一一概述)
if(len>6&&countLetter(passwd,NUM)>0&&countLetter(passwd,SMALL_LETTER)>0
&&countLetter(passwd,CAPITAL_LETTER)>0||countLetter(passwd,NUM)>0
&&countLetter(passwd,SMALL_LETTER)>0&&countLetter(passwd,OTHER_CHAR)>0
||countLetter(passwd,NUM)>0&&countLetter(passwd,CAPITAL_LETTER)>0
&&countLetter(passwd,OTHER_CHAR)>0||countLetter(passwd,SMALL_LETTER)>0
&&countLetter(passwd,CAPITAL_LETTER)>0&&countLetter(passwd,OTHER_CHAR)>0){
level++;
}
//密码长度大于8并且4种类型组合......(不一一概述)
if(len>8&&countLetter(passwd,NUM)>0&&countLetter(passwd,SMALL_LETTER)>0
&&countLetter(passwd,CAPITAL_LETTER)>0&&countLetter(passwd,OTHER_CHAR)>0){
level++;
}
//密码长度大于6并且2种类型组合每种类型长度大于等于3或者2......(不一一概述)
if(len>6&&countLetter(passwd,NUM)>=3&&countLetter(passwd,SMALL_LETTER)>=3
||countLetter(passwd,NUM)>=3&&countLetter(passwd,CAPITAL_LETTER)>=3
||countLetter(passwd,NUM)>=3&&countLetter(passwd,OTHER_CHAR)>=2
||countLetter(passwd,SMALL_LETTER)>=3&&countLetter(passwd,CAPITAL_LETTER)>=3
||countLetter(passwd,SMALL_LETTER)>=3&&countLetter(passwd,OTHER_CHAR)>=2
||countLetter(passwd,CAPITAL_LETTER)>=3&&countLetter(passwd,OTHER_CHAR)>=2){
level++;
}
//密码长度大于8并且3种类型组合每种类型长度大于等于3或者2......(不一一概述)
if(len>8&&countLetter(passwd,NUM)>=2&&countLetter(passwd,SMALL_LETTER)>=2
&&countLetter(passwd,CAPITAL_LETTER)>=2||countLetter(passwd,NUM)>=2
&&countLetter(passwd,SMALL_LETTER)>=2&&countLetter(passwd,OTHER_CHAR)>=2
||countLetter(passwd,NUM)>=2&&countLetter(passwd,CAPITAL_LETTER)>=2
&&countLetter(passwd,OTHER_CHAR)>=2||countLetter(passwd,SMALL_LETTER)>=2
&&countLetter(passwd,CAPITAL_LETTER)>=2&&countLetter(passwd,OTHER_CHAR)>=2){
level++;
}
//密码长度大于10并且4种类型组合每种类型长度大于等于2......(不一一概述)
if(len>10&&countLetter(passwd,NUM)>=2&&countLetter(passwd,SMALL_LETTER)>=2
&&countLetter(passwd,CAPITAL_LETTER)>=2&&countLetter(passwd,OTHER_CHAR)>=2){
level++;
}
//特殊字符>=3level++;
if(countLetter(passwd,OTHER_CHAR)>=3){
level++;
}
//特殊字符>=6level++;
if(countLetter(passwd,OTHER_CHAR)>=6){
level++;
}
//长度>12>16level++
if(len>12){
level++;
if(len>=16){
level++;
}
}
//减少点
if("abcdefghijklmnopqrstuvwxyz".indexOf(passwd)>0||"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(passwd)>0){
level--;
}
if("qwertyuiop".indexOf(passwd)>0||"asdfghjkl".indexOf(passwd)>0||"zxcvbnm".indexOf(passwd)>0){
level--;
}
if(StringUtils.isNumeric(passwd)&&("01234567890".indexOf(passwd)>0||"09876543210".indexOf(passwd)>0)){
level--;
}
if(countLetter(passwd,NUM)==len||countLetter(passwd,SMALL_LETTER)==len
||countLetter(passwd,CAPITAL_LETTER)==len){
level--;
}
if(len%2==0){//aaabbb
Stringpart1=passwd.substring(0,len/2);
Stringpart2=passwd.substring(len/2);
if(part1.equals(part2)){
level--;
}
if(StringUtils.isCharEqual(part1)&&StringUtils.isCharEqual(part2)){
level--;
}
}
if(len%3==0){//ababab
Stringpart1=passwd.substring(0,len/3);
Stringpart2=passwd.substring(len/3,len/3*2);
Stringpart3=passwd.substring(len/3*2);
if(part1.equals(part2)&&part2.equals(part3)){
level--;
}
}
if(StringUtils.isNumeric(passwd)&&len>=6){//19881010or881010
intyear=0;
if(len==8||len==6){
year=Integer.parseInt(passwd.substring(0,len-4));
}
intsize=StringUtils.sizeOfInt(year);
intmonth=Integer.parseInt(passwd.substring(size,size+2));
intday=Integer.parseInt(passwd.substring(size+2,len));
if(year>=1950&&year<2050&&month>=1&&month<=12&&day>=1&&day<=31){
level--;
}
}
if(null!=DICTIONARY&&DICTIONARY.length>0){//dictionary
for(inti=0;i=0){
level--;
break;
}
}
}
if(len<=6){
level--;
if(len<=4){
level--;
if(len<=3){
level=0;
}
}
}
if(StringUtils.isCharEqual(passwd)){
level=0;
}
if(level<0){
level=0;
}
returnlevel;
}
/**
*获得密码强度等级,包括简单、复杂、强、强、强
*
*@parampasswd
*@return
*/
publicstaticLEVELgetPasswordLevel(Stringpasswd){
intlevel=checkPasswordStrength(passwd);
switch(level){
case0:
case1:
case2:
case3:
returnLEVEL.EASY;
case4:
case5:
case6:
returnLEVEL.MIDIUM;
case7:
case8:
case9:
returnLEVEL.STRONG;
case10:
case11:
case12:
returnLEVEL.VERY_STRONG;
default:
returnLEVEL.EXTREMELY_STRONG;
}
}
}
StringUtils.java文件:
packagecom.wx.pwd;
/**
*字符串工具类
*
*@authorvenshine
*/
publicclassStringUtils{
privatefinalstaticint[]SIZE_TABLE={9,99,999,9999,99999,999999,9999999,99999999,999999999,
Integer.MAX_VALUE};
/**
*计算一个整数的大小
*
*@paramx
*@return
*/
publicstaticintsizeOfInt(intx){
for(inti=0;;i++)
if(x<=SIZE_TABLE[i]){
returni+1;
}
}
/**
*判断字符串的每个字符是否相等
*
*@paramstr
*@return
*/
publicstaticbooleanisCharEqual(Stringstr){
returnstr.replace(str.charAt(0),'').trim().length()==0;
}
/**
*确定字符串是否为数字
*
*@paramstr
*@return
*/
publicstaticbooleanisNumeric(Stringstr){
for(inti=str.length();--i>=0;){
if(!Character.isDigit(str.charAt(i))){
returnfalse;
}
}
returntrue;
}
/**
*判断字符串是否为空格、空(“)”或null。
*
*@paramstr
*@return
*/
publicstaticbooleanequalsNull(Stringstr){
intstrLen;
if(str==null||(strLen=str.length())==0||str.equalsIgnoreCase("null")){
returntrue;
}
for(inti=0;i
CheckPWD.java文件:
packagecom.wx.pwd;
publicclassCheckPWD{
publicstaticvoidmain(String[]args){
Stringpasswd="myNameJOB123_-+=";
System.out.println(CheckStrength.checkPasswordStrength(passwd));
System.out.println(CheckStrength.getPasswordLevel(passwd));
}
}
运行结果:
13
EXTREMELY_STRONG
PS:这里再为大家提供两款功能类似的在线工具供大家参考:
密码安全性在线检测:
http://tools.jb51.net/password/my_password_safe
高强度密码生成器:
http://tools.jb51.net/password/CreateStrongPassword
在线随机数字/字符串生成工具:
http://tools.jb51.net/aideddesign/suijishu
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。