1、一次性口令设计
口令攻击常常作为黑客目标攻击的开始,一旦黑客获取了目标机上的用户口令,就可以进入目标计算机,对目标机造成严重的安全威胁。
一次性口令是增强口令安全的有效方法之一。其主要设计思想是:设计一种动态生成口令的算法,使生成的口令只能使用一次,当再次使用时,该口令无效。从而有效地避免了基于口令破解的口令攻击。
2、 算法设计
可以通过以下两种方式设计算法
(1)数学计算式
选定一个数学计算式(函数),系统提供该函数的一个变量,用户计算并返回函数值,按照用户的响应判断其真实性。
e.g.1: f(x)=x+1
系统提示x,用户输入x+1
(2)字符串组合式
选定一个字符串组合式,系统提供特征字符串,用户根据组合方式返回字符串,系统按照用户的响应判断其真实性。
e.g.2: f(a1a2a3a4a5a6)=a1a3a4a6
系统提供特征串:Friend
用户变换此字符串为:Fied
输入后进行口令认证。
具体设计内容:
- 编写一个一次性口令程序
- 运行该口令程序,屏幕上弹出一个仿Windows窗口,提示用户输入口令,并给出提示模式。
- 用户输入口令,按照一次性算法计算比较,符合,给出合法用户提示;否则给出非法用户提示。
- 再一次运行口令程序,如果输入与第一次同样的口令,系统应当拒绝,提示非法用户。每次提示和输入的口令都是不一样的。
写出设计说明(含公式、算法,随机数产生法,函数调用和参数传递方式)
思路:先写出一次性口令程序,再将其放置在系统启动程序中。
全部代码如下:
#include<time.h>
#include<stdlib.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<windows.h>
void function1(){//数字运算器
int i,j,y,m;
time_t t;
srand((unsigned)time(&t));
i=rand()%1000;
j=rand()%10+1;
y=i+j;
printf("系统提示:y=%d+%d\n",i,j);
printf("请输入y值:");
scanf("%d",&m);
if(m==y)
{MessageBox(NULL,"合法用户!验证通过!","用户验证",MB_OK);
printf("合法用户!\n");}
else
{MessageBox(NULL,"非法用户!验证通过!","用户验证",MB_OK);
printf("非法用户输入!!\n");}
}
void function2(){//随机字符运算器
char a[10];
char b[9];
char c[9];
int i,s,m=0;
time_t t;
srand((unsigned)time(&t));
s=rand()%9;
for(i=0;i<10;i++)
a[i]=rand()%26+'a';
for(i=0;i<9;i++)
{
if(i<s-1)
b[i]=a[i];
else
b[i]=a[i+1];
}
printf("系统提示特征串为:\n");
for(i=0;i<10;i++)
printf("%c",a[i]);
printf("\n特征组合为:消去%d值:\n",s);
for(i=0;i<9;i++)
scanf("%c",&c[i]);
if(b[0]==c[0]&&b[1]==c[1]&&b[2]==c[2]&&b[3]==c[3]&&b[4]==c[4]&&b[5]==c[5]&&b[6]==c[6]&&b[7]==c[7]&&b[8]==c[8])
{MessageBox(NULL,"合法用户!验证通过!","用户验证",MB_OK);
printf("合法用户!\n");}
else
{MessageBox(NULL,"非法用户!验证通过!","用户验证",MB_OK);
printf("非法用户输入!!\n");}
}
int main(){
int i;
list:printf("选择一个一次口令运算器:\n1.加法运算器\n2.字符串运算器\n3.结束\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1:function1();
goto list;
case 2:function2();
goto list;
case 3:exit(1);
}
return 0;
}
实现效果如下: