C语言实现密码强度检测

时间:2021-10-20 20:32:09

本文实例为大家分享了C语言实现密码强度检测,供大家参考,具体内容如下

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表示数字个数

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

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

C语言实现密码强度检测

四、连续大写字母:

  • 公式:-(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
int passwdmeter(char *passwd)
{
 int i = 0;
 //1.密码长度
 int passwdlen;
 passwdlen = strlen(passwd);
 
 //2~5.大小写字母个数,数字个数,符号个数
 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.位于中间的数字或符号
 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.只有数字
 int NumbersOnly = 0;
 if (Numbers == passwdlen)
 NumbersOnly = passwdlen;
 
 //3.重复字符数(大小写敏感)
 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.连续大小写字母,数字
 int ConsecutiveUppercaseLetters = 0;
 int ConsecutiveLowercaseLetters = 0;
 int ConsecutiveNumbers  = 0;
 
 int flag = 0;//1-小写,2-大写,3-数字
 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 正序或者逆序的字母数字及符号
 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;
 
 //减分项计算
 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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/u012023606/article/details/83184442