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表示大寫字母個(gè)數(shù),len表示密碼長度
三、小寫字母:
公式:+((len-n)*2),其中n表示小寫字母個(gè)數(shù),len表示密碼長度
四、數(shù)字:
- 公式:+(n*4),其中n表示數(shù)字個(gè)數(shù)
- 條件:滿足n < len,才能得到加分,len表示密碼長度
五、符號:
公式:+(n*6),其中n表示符號個(gè)數(shù)
六、位于中間的數(shù)字或符號:
公式:+(n*2),其中n表示位于中間的數(shù)字或符號個(gè)數(shù)
七、最低條件得分:
- 公式:+(n*2),其中n表示滿足的最低條件條目數(shù)
- 條件:只有滿足最低條件,才能得到加分
其中最低條件的條目如下:
1.密碼長度不小于8位
2.包含大寫字母
3.包含小寫字母
4.包含數(shù)字
5.包含符號
最低條件要求滿足條目1并至少滿足條目2-5中的任意三條。
2 方案減分項(xiàng)
一、只有字母:
公式:-n,其中n表示字母個(gè)數(shù)
二、只有數(shù)字:
公式:-n,其中n表示數(shù)字個(gè)數(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個(gè)字母或以上,才會(huì)減分,
例1:如輸入ABC,則n=1
例2:如輸入dcBA,則n=2
八、正序或逆序數(shù)字:
- 公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
- 條件:只有連續(xù)3個(gè)數(shù)字或以上,才會(huì)減分
- 例1:如輸入123,則n=1,
- 例2:如輸入4321,則n=2
- 例3:如輸入12,則不會(huì)減分
九、正序或逆序符號:
- 公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
- 條件:只有連續(xù)3個(gè)符號或以上,才會(huì)減分
3 方案等級劃分
根據(jù)密碼評分,將密碼劃分成以下5個(gè)等級:
>= 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.大小寫字母個(gè)數(shù),數(shù)字個(gè)數(shù),符號個(gè)數(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++實(shí)現(xiàn)Qt信號和槽機(jī)制
信號和槽機(jī)制是 Qt 的核心機(jī)制,可以讓編程人員將互不相關(guān)的對象綁定在一起,實(shí)現(xiàn)對象之間的通信,本文就來深入理解c++實(shí)現(xiàn)Qt信號和槽機(jī)制,感興趣的可以了解一下2023-08-08C語言實(shí)例真題講解數(shù)據(jù)結(jié)構(gòu)中單向環(huán)形鏈表
鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時(shí),就可以使用鏈表,這一點(diǎn)和數(shù)組很相似2022-04-04iostream與iostream.h的區(qū)別詳細(xì)解析
以下是對C++中iostream與iostream.h的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09VSCode插件開發(fā)全攻略之打包、發(fā)布、升級的詳細(xì)教程
這篇文章主要介紹了VSCode插件開發(fā)全攻略之打包、發(fā)布、升級的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05詳解Qt使用QImage類實(shí)現(xiàn)圖像基本操作
這篇文章主要介紹了Qt如何利用QImage類實(shí)現(xiàn)對圖像的基本操作,包括圖像顯示、圖像縮放、圖像旋轉(zhuǎn)等,感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-06-06