c语言实现密码强度检测

转自:
https://blog.csdn.net/u012023606/article/details/83184442

1 方案得分项

一、密码长度:

  • 公式 :+(n*4),其中n表示密码长度

二、大写字母:

  • 公式:+((len-n)*2),其中n表示大写字母个数,len表示密码长度

三、小写字母:

  • 公式:+((len-n)*2),其中n表示小写字母个数,len表示密码长度

四、数字:

  • 公式:+(n*4),其中n表示数字个数
  • 条件:满足n < len,才能得到加分,len表示密码长度

五、符号:

  • 公式:+(n*6),其中n表示符号个数

六、位于中间的数字或符号:

  • 公式:+(n*2),其中n表示位于中间的数字或符号个数

七、最低条件得分:

  • 公式:+(n*2),其中n表示满足的最低条件条目数
  • 条件:只有满足最低条件,才能得到加分

其中最低条件的条目如下:

  • 1.密码长度不小于8位
  • 2.包含大写字母
  • 3.包含小写字母
  • 4.包含数字
  • 5.包含符号

最低条件要求满足条目1并至少满足条目2-5中的任意三条。

2 方案减分项

一、只有字母:

  • 公式:-n,其中n表示字母个数

二、只有数字:

  • 公式:-n,其中n表示数字个数

三、重复字符数(大小写敏感):

该项描述复杂,具体计算方法见如下示例程序:

四、连续大写字母:

  • 公式:-(n*2),其中n表示连续大写字母出现的次数
  • 举例:如输入AUB,则n=2

五、连续小写字母:

  • 公式:-(n*2),其中n表示连续小写字母出现的次数
  • 举例:如输入aub,则n=2

六、连续数字:

  • 公式:-(n*2),其中n表示连续数字出现的次数
  • 举例:如输入381,则n=2

七、正序或逆序字母:

  • 公式:-(n*3),其中n表示连续发生的次数
    • 正序或逆序是指字母表中的顺序
    • 不区分大小写
  • 条件:只有连续3个字母或以上,才会减分,
  • 例1:如输入ABC,则n=1
  • 例2:如输入dcBA,则n=2

八、正序或逆序数字:

  • 公式:-(n*3),其中n表示连续发生的次数
  • 条件:只有连续3个数字或以上,才会减分
  • 例1:如输入123,则n=1,
  • 例2:如输入4321,则n=2
  • 例3:如输入12,则不会减分

九、正序或逆序符号:

  • 公式:-(n*3),其中n表示连续发生的次数
  • 条件:只有连续3个符号或以上,才会减分

3 方案等级划分

根据密码评分,将密码划分成以下5个等级:

  • >= 80: 非常强(VERY_STRONG)
  • >= 60: 强(STRONG)
  • >= 40: 好(GOOD)
  • >= 20: 弱(WEAK)
  • >= 0: 非常弱( VERY_WEAK)

 
 
  1. int passwdmeter(char *passwd)
  2. {
  3. int i = 0;
  4. //1.密码长度
  5. int passwdlen;
  6. passwdlen = strlen(passwd);
  7. //2~5.大小写字母个数,数字个数,符号个数
  8. int UppercaseLetters = 0;
  9. int LowercaseLetters = 0;
  10. int Numbers = 0,Symbols = 0;
  11. for(i = 0;i < passwdlen; i++)
  12. {
  13. if (passwd[i]>= 'a' && passwd[i] <= 'z')
  14. LowercaseLetters++;
  15. else if (passwd[i]>= 'A' && passwd[i] <= 'Z')
  16. UppercaseLetters++;
  17. else if(passwd[i]>= '0' && passwd[i] <= '9')
  18. Numbers++;
  19. else
  20. Symbols++;
  21. }
  22. //6.位于中间的数字或符号
  23. int MiddleNumbersorSymbols = Numbers+Symbols;
  24. if (passwd[ 0]>= 'a' && passwd[ 0] <= 'z') ;
  25. else if (passwd[ 0]>= 'A' && passwd[ 0] <= 'Z') ;
  26. else if(passwd[ 0]>= '0' && passwd[ 0] <= '9')
  27. MiddleNumbersorSymbols--;
  28. else
  29. MiddleNumbersorSymbols--;
  30. if (passwd[passwdlen - 1]>= 'a' && passwd[passwdlen - 1] <= 'z') ;
  31. else if (passwd[passwdlen - 1]>= 'A' && passwd[passwdlen - 1] <= 'Z') ;
  32. else if(passwd[passwdlen - 1]>= '0' && passwd[passwdlen - 1] <= '9')
  33. MiddleNumbersorSymbols--;
  34. else
  35. MiddleNumbersorSymbols--;
  36. //7.最低条件得分
  37. int Requirements = 0;
  38. if(UppercaseLetters > 0)Requirements++;
  39. if(LowercaseLetters > 0)Requirements++;
  40. if(Numbers > 0)Requirements++;
  41. if(Symbols > 0)Requirements++;
  42. if(passwdlen > 8)Requirements++;
  43. //总加得分
  44. int Bonus = passwdlen* 4 + Symbols* 6 + MiddleNumbersorSymbols* 2;
  45. if (UppercaseLetters)Bonus+= (passwdlen - UppercaseLetters)* 2;
  46. if (LowercaseLetters)Bonus+= (passwdlen - LowercaseLetters)* 2;
  47. if (Requirements > 3)Bonus+= Requirements* 2;
  48. if (Numbers != passwdlen)Bonus+= Numbers* 4;
  49. //1.只有字母
  50. int LettersOnly = 0;
  51. if (UppercaseLetters + LowercaseLetters == passwdlen)
  52. LettersOnly = passwdlen;
  53. //2.只有数字
  54. int NumbersOnly = 0;
  55. if (Numbers == passwdlen)
  56. NumbersOnly = passwdlen;
  57. //3.重复字符数(大小写敏感)
  58. int RepeatCharacters = 0;
  59. int repChar = 0;
  60. for(i = 0; i < passwdlen; i++) {
  61. int exists = 0;
  62. int j = 0;
  63. for (j = 0; j < passwdlen; j++) {
  64. if (passwd[i] == passwd[j] && i != j) {
  65. exists = 1;
  66. RepeatCharacters += abs(passwdlen/(j-i));
  67. }
  68. }
  69. if (exists) {
  70. repChar++;
  71. int unqChar = passwdlen - repChar;
  72. RepeatCharacters = (unqChar) ? ceil(RepeatCharacters/( double)unqChar) : ceil(RepeatCharacters);
  73. }
  74. }
  75. //4~6.连续大小写字母,数字
  76. int ConsecutiveUppercaseLetters = 0;
  77. int ConsecutiveLowercaseLetters = 0;
  78. int ConsecutiveNumbers = 0;
  79. int flag = 0; //1-小写,2-大写,3-数字
  80. int count = 0;
  81. for(i = 0 ;i < passwdlen;i++)
  82. {
  83. if(i == 0){
  84. if (passwd[i]>= 'a' && passwd[i] <= 'z'){flag = 1;count = 1;}
  85. else if (passwd[i]>= 'A' && passwd[i] <= 'Z'){flag = 2;count = 1;}
  86. else if(passwd[i]>= '0' && passwd[i] <= '9'){flag = 3;count = 1;}
  87. } else
  88. {
  89. int tmpflag = 0;
  90. if (passwd[i]>= 'a' && passwd[i] <= 'z')
  91. {
  92. tmpflag = 1;
  93. }
  94. else if (passwd[i]>= 'A' && passwd[i] <= 'Z')
  95. {
  96. tmpflag = 2;
  97. }
  98. else if(passwd[i]>= '0' && passwd[i] <= '9')
  99. {
  100. tmpflag = 3;
  101. } else
  102. {
  103. tmpflag = 0;
  104. }
  105. if(tmpflag == flag)
  106. count++;
  107. else
  108. {
  109. if(count >= 2)
  110. {
  111. switch(flag)
  112. {
  113. case 1:
  114. ConsecutiveLowercaseLetters += count -1; break;
  115. case 2:
  116. ConsecutiveUppercaseLetters += count -1; break;
  117. case 3:
  118. ConsecutiveNumbers += count -1; break;
  119. default:
  120. break;
  121. }
  122. }
  123. flag = tmpflag;
  124. count = 1;
  125. }
  126. }
  127. }
  128. if(count >= 2)
  129. {
  130. switch(flag)
  131. {
  132. case 1:
  133. ConsecutiveLowercaseLetters += count -1; break;
  134. case 2:
  135. ConsecutiveUppercaseLetters += count -1; break;
  136. case 3:
  137. ConsecutiveNumbers += count -1; break;
  138. default:
  139. break;
  140. }
  141. }
  142. //7~9 正序或者逆序的字母数字及符号
  143. int SequentialLetters = 0;
  144. int Sequenflag = 0; //1-正序,2-反序
  145. int Sequencount = 1;
  146. for(i = 1 ;i < passwdlen;i++)
  147. {
  148. int value = passwd[i];
  149. if(passwd[i]>= 'a' && passwd[i] <= 'z' && passwd[i -1]>= 'A' && passwd[i -1] <= 'Z')
  150. value = passwd[i] - 32;
  151. else if(passwd[i -1]>= 'a' && passwd[i -1] <= 'z' && passwd[i]>= 'A' && passwd[i] <= 'Z')
  152. value = passwd[i] + 32;
  153. int tmpflag = 0;
  154. if ( value - 1 == passwd[i -1])
  155. {
  156. tmpflag = 1;
  157. } else if ( value + 1 == passwd[i -1])
  158. tmpflag = 2;
  159. else
  160. tmpflag = 0;
  161. if(Sequenflag == 0 && tmpflag != 0)
  162. {
  163. Sequencount = 1;
  164. Sequenflag = tmpflag;
  165. }
  166. if (tmpflag == Sequenflag)
  167. {
  168. Sequencount++;
  169. } else
  170. {
  171. if(Sequencount >= 3 && Sequenflag != 0)
  172. SequentialLetters += Sequencount -2;
  173. Sequencount = 1;
  174. Sequenflag = tmpflag;
  175. }
  176. }
  177. if(Sequencount >= 3 && Sequenflag != 0)
  178. SequentialLetters += Sequencount -2;
  179. //减分项计算
  180. int Bonus2 = LettersOnly + NumbersOnly + RepeatCharacters + (ConsecutiveUppercaseLetters+ConsecutiveLowercaseLetters+ConsecutiveNumbers)* 2 + SequentialLetters* 3;
  181. int sum = 0;
  182. if (Bonus - Bonus2 < 0)
  183. return 0;
  184. return (Bonus - Bonus2) > 100? 100:(Bonus - Bonus2);
  185. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值