C語言實(shí)現(xiàn)密碼強(qiáng)度檢測
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)密碼強(qiáng)度檢測,供大家參考,具體內(nèi)容如下
1 方案得分項(xiàng)
一、密碼長度:
公式 :+(n*4),其中n表示密碼長度
二、大寫字母:
公式:+((len-n)*2),其中n表示大寫字母個數(shù),len表示密碼長度
三、小寫字母:
公式:+((len-n)*2),其中n表示小寫字母個數(shù),len表示密碼長度
四、數(shù)字:
- 公式:+(n*4),其中n表示數(shù)字個數(shù)
- 條件:滿足n < len,才能得到加分,len表示密碼長度
五、符號:
公式:+(n*6),其中n表示符號個數(shù)
六、位于中間的數(shù)字或符號:
公式:+(n*2),其中n表示位于中間的數(shù)字或符號個數(shù)
七、最低條件得分:
- 公式:+(n*2),其中n表示滿足的最低條件條目數(shù)
- 條件:只有滿足最低條件,才能得到加分
其中最低條件的條目如下:
1.密碼長度不小于8位
2.包含大寫字母
3.包含小寫字母
4.包含數(shù)字
5.包含符號
最低條件要求滿足條目1并至少滿足條目2-5中的任意三條。
2 方案減分項(xiàng)
一、只有字母:
公式:-n,其中n表示字母個數(shù)
二、只有數(shù)字:
公式:-n,其中n表示數(shù)字個數(shù)
三、重復(fù)字符數(shù)(大小寫敏感):
該項(xiàng)描述復(fù)雜,具體計(jì)算方法見如下示例程序:

四、連續(xù)大寫字母:
- 公式:-(n*2),其中n表示連續(xù)大寫字母出現(xiàn)的次數(shù)
- 舉例:如輸入AUB,則n=2
五、連續(xù)小寫字母:
- 公式:-(n*2),其中n表示連續(xù)小寫字母出現(xiàn)的次數(shù)
- 舉例:如輸入aub,則n=2
六、連續(xù)數(shù)字:
- 公式:-(n*2),其中n表示連續(xù)數(shù)字出現(xiàn)的次數(shù)
- 舉例:如輸入381,則n=2
七、正序或逆序字母:
公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
- 正序或逆序是指字母表中的順序
- 不區(qū)分大小寫
條件:只有連續(xù)3個字母或以上,才會減分,
例1:如輸入ABC,則n=1
例2:如輸入dcBA,則n=2
八、正序或逆序數(shù)字:
- 公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
- 條件:只有連續(xù)3個數(shù)字或以上,才會減分
- 例1:如輸入123,則n=1,
- 例2:如輸入4321,則n=2
- 例3:如輸入12,則不會減分
九、正序或逆序符號:
- 公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
- 條件:只有連續(xù)3個符號或以上,才會減分
3 方案等級劃分
根據(jù)密碼評分,將密碼劃分成以下5個等級:
>= 80: 非常強(qiáng)(VERY_STRONG)
>= 60: 強(qiáng)(STRONG)
>= 40: 好(GOOD)
>= 20: 弱(WEAK)
>= 0: 非常弱( VERY_WEAK)
int passwdmeter(char *passwd)
{
int i = 0;
//1.密碼長度
int passwdlen;
passwdlen = strlen(passwd);
//2~5.大小寫字母個數(shù),數(shù)字個數(shù),符號個數(shù)
int UppercaseLetters = 0;
int LowercaseLetters = 0;
int Numbers = 0,Symbols = 0;
for(i = 0;i < passwdlen; i++)
{
if (passwd[i]>='a' && passwd[i] <= 'z')
LowercaseLetters++;
else if (passwd[i]>='A' && passwd[i] <= 'Z')
UppercaseLetters++;
else if(passwd[i]>='0' && passwd[i] <= '9')
Numbers++;
else
Symbols++;
}
//6.位于中間的數(shù)字或符號
int MiddleNumbersorSymbols = Numbers+Symbols;
if (passwd[0]>='a' && passwd[0] <= 'z') ;
else if (passwd[0]>='A' && passwd[0] <= 'Z') ;
else if(passwd[0]>='0' && passwd[0] <= '9')
MiddleNumbersorSymbols--;
else
MiddleNumbersorSymbols--;
if (passwd[passwdlen - 1]>='a' && passwd[passwdlen - 1] <= 'z') ;
else if (passwd[passwdlen - 1]>='A' && passwd[passwdlen - 1] <= 'Z') ;
else if(passwd[passwdlen - 1]>='0' && passwd[passwdlen - 1] <= '9')
MiddleNumbersorSymbols--;
else
MiddleNumbersorSymbols--;
//7.最低條件得分
int Requirements = 0;
if(UppercaseLetters > 0)Requirements++;
if(LowercaseLetters > 0)Requirements++;
if(Numbers > 0)Requirements++;
if(Symbols > 0)Requirements++;
if(passwdlen > 8)Requirements++;
//總加得分
int Bonus = passwdlen*4 + Symbols*6 + MiddleNumbersorSymbols*2;
if (UppercaseLetters)Bonus+= (passwdlen - UppercaseLetters)*2;
if (LowercaseLetters)Bonus+= (passwdlen - LowercaseLetters)*2;
if (Requirements > 3)Bonus+= Requirements*2;
if (Numbers != passwdlen)Bonus+= Numbers*4;
//1.只有字母
int LettersOnly = 0;
if (UppercaseLetters + LowercaseLetters == passwdlen)
LettersOnly = passwdlen;
//2.只有數(shù)字
int NumbersOnly = 0;
if (Numbers == passwdlen)
NumbersOnly = passwdlen;
//3.重復(fù)字符數(shù)(大小寫敏感)
int RepeatCharacters = 0;
int repChar = 0;
for(i = 0; i < passwdlen; i++) {
int exists = 0;
int j = 0;
for (j = 0; j < passwdlen; j++) {
if (passwd[i] == passwd[j] && i != j) {
exists = 1;
RepeatCharacters += abs(passwdlen/(j-i));
}
}
if (exists) {
repChar++;
int unqChar = passwdlen - repChar;
RepeatCharacters = (unqChar) ? ceil(RepeatCharacters/(double)unqChar) : ceil(RepeatCharacters);
}
}
//4~6.連續(xù)大小寫字母,數(shù)字
int ConsecutiveUppercaseLetters = 0;
int ConsecutiveLowercaseLetters = 0;
int ConsecutiveNumbers = 0;
int flag = 0;//1-小寫,2-大寫,3-數(shù)字
int count = 0;
for(i = 0 ;i < passwdlen;i++)
{
if(i == 0){
if (passwd[i]>='a' && passwd[i] <= 'z'){flag = 1;count = 1;}
else if (passwd[i]>='A' && passwd[i] <= 'Z'){flag = 2;count = 1;}
else if(passwd[i]>='0' && passwd[i] <= '9'){flag = 3;count = 1;}
}else
{
int tmpflag = 0;
if (passwd[i]>='a' && passwd[i] <= 'z')
{
tmpflag = 1;
}
else if (passwd[i]>='A' && passwd[i] <= 'Z')
{
tmpflag = 2;
}
else if(passwd[i]>='0' && passwd[i] <= '9')
{
tmpflag = 3;
}else
{
tmpflag = 0;
}
if(tmpflag == flag)
count++;
else
{
if(count >= 2)
{
switch(flag)
{
case 1:
ConsecutiveLowercaseLetters += count-1;break;
case 2:
ConsecutiveUppercaseLetters += count-1;break;
case 3:
ConsecutiveNumbers += count-1;break;
default:
break;
}
}
flag = tmpflag;
count = 1;
}
}
}
if(count >= 2)
{
switch(flag)
{
case 1:
ConsecutiveLowercaseLetters += count-1;break;
case 2:
ConsecutiveUppercaseLetters += count-1;break;
case 3:
ConsecutiveNumbers += count-1;break;
default:
break;
}
}
//7~9 正序或者逆序的字母數(shù)字及符號
int SequentialLetters = 0;
int Sequenflag = 0;//1-正序,2-反序
int Sequencount = 1;
for(i = 1 ;i < passwdlen;i++)
{
int value = passwd[i];
if(passwd[i]>='a' && passwd[i] <= 'z' && passwd[i-1]>='A' && passwd[i-1] <= 'Z')
value = passwd[i] - 32;
else if(passwd[i-1]>='a' && passwd[i-1] <= 'z' && passwd[i]>='A' && passwd[i] <= 'Z')
value = passwd[i] + 32;
int tmpflag = 0;
if (value - 1 == passwd[i-1])
{
tmpflag = 1;
}else if (value + 1 == passwd[i-1])
tmpflag = 2;
else
tmpflag = 0;
if(Sequenflag == 0 && tmpflag != 0)
{
Sequencount = 1;
Sequenflag = tmpflag;
}
if (tmpflag == Sequenflag)
{
Sequencount++;
}else
{
if(Sequencount >= 3 && Sequenflag != 0)
SequentialLetters += Sequencount-2;
Sequencount = 1;
Sequenflag = tmpflag;
}
}
if(Sequencount >= 3 && Sequenflag != 0)
SequentialLetters += Sequencount-2;
//減分項(xiàng)計(jì)算
int Bonus2 = LettersOnly + NumbersOnly + RepeatCharacters + (ConsecutiveUppercaseLetters+ConsecutiveLowercaseLetters+ConsecutiveNumbers)*2 + SequentialLetters*3;
int sum = 0;
if (Bonus - Bonus2 < 0)
return 0;
return (Bonus - Bonus2) > 100?100:(Bonus - Bonus2);
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
這篇文章主要介紹了C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié),包括正弦和雙曲線正弦以及反正弦的函數(shù),需要的朋友可以參考下2015-08-08
講解C++的do while循環(huán)和循環(huán)語句的嵌套使用方法
這篇文章主要介紹了講解C++的do while循環(huán)和循環(huán)語句的嵌套使用方法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何溧陽C++實(shí)現(xiàn)文件逐行讀取與字符匹配的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-03-03
C語言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例
這篇文章主要介紹了C語言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例,分別是基于最大堆的升序排序和基于最小堆的降序排序?qū)嵗?需要的朋友可以參考下2016-06-06
C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合(HashSet)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

