广告位联系
返回顶部
分享到

C语言实现密码强度检测的方法

C语言 来源:互联网搜集 作者:秩名 发布时间:2020-03-18 20:33:15 人浏览
摘要

1 方案得分项 一、密码长度: 公式 :+(n*4),其中n表示密码长度 二、大写字母: 公式:+((len-n)*2),其中n表示大写字母个数,len表示密码长度 三、小写字母: 公式:+((len-n)*2),其中n表示小写字母个数,len表示密码长度 四、数字: 公式:+(n*4),其中n

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

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

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

-[-/a>

四、连续大写字母:

  • 公式:-(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);
}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/u012023606/article/details/83184442
相关文章
  • C++中类的六大默认成员函数的介绍

    C++中类的六大默认成员函数的介绍
    一、类的默认成员函数 二、构造函数Date(形参列表) 构造函数主要完成初始化对象,相当于C语言阶段写的Init函数。 默认构造函数:无参的构
  • C/C++实现遍历文件夹最全方法总结介绍

    C/C++实现遍历文件夹最全方法总结介绍
    一、filesystem(推荐) 在c++17中,引入了文件系统,使用起来非常方便 在VS中,可以直接在项目属性中调整: 只要是C++17即以上都可 然后头文件
  • C语言实现手写Map(数组+链表+红黑树)的代码

    C语言实现手写Map(数组+链表+红黑树)的代码
    要求 需要准备数组集合(List) 数据结构 需要准备单向链表(Linked) 数据结构 需要准备红黑树(Rbtree)数据结构 需要准备红黑树和链表适配策略
  • MySQL系列教程之使用C语言来连接数据库

    MySQL系列教程之使用C语言来连接数据库
    写在前面 知道了 Java中使用 JDBC编程 来连接数据库了,但是使用 C语言 来连接数据库却总是连接不上去~ 立即安排一波使用 C语言连接 MySQL数
  • 基于C语言实现简单学生成绩管理系统

    基于C语言实现简单学生成绩管理系统
    一、系统主要功能 1、密码登录 2、输入数据 3、查询成绩 4、修改成绩 5、输出所有学生成绩 6、退出系统 二、代码实现 1 2 3 4 5 6 7 8 9 10 11
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统
    1.功能模块图; 2.各个模块详细的功能描述。 1.登陆:登陆分为用户登陆,管理员登陆以及维修员登录,登陆后不同的用户所执行的操作
  • C++继承与菱形继承的介绍

    C++继承与菱形继承的介绍
    继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加
  • C/C++指针介绍与使用介绍

    C/C++指针介绍与使用介绍
    什么是指针 C/C++语言拥有在程序运行时获得变量的地址和操作地址的能力,这种用来操作地址的特殊类型变量被称作指针。 翻译翻译什么
  • C++进程的创建和进程ID标识介绍
    进程的ID 进程的ID,可称为PID。它是进程的唯一标识,类似于我们的身份证号是唯一标识,因为名字可能会和其他人相同,生日可能会与其他
  • C++分析如何用虚析构与纯虚析构处理内存泄漏

    C++分析如何用虚析构与纯虚析构处理内存泄漏
    一、问题引入 使用多态时,如果有一些子类的成员开辟在堆区,那么在父类执行完毕释放后,没有办法去释放子类的内存,这样会导致内存
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计