马相芬
摘要:验证码技术通常使用一些线条、随机数、符号和不规则的字符组成,借此防止一些黑客把密码数据化或者在网络上用机器人自动注册、登录和灌水。为此该文介绍了一种基于C#和GDI+技术的验证码的实现方法。
关键词:验证码;GDI+;随机数
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)09-0108-02
Abstract: the verification code technology is usually used some lines, random numbers, symbols and irregular characters, to prevent some hackers password data or in the network using robots to automatically register, login and irrigation. This paper introduces a realization method of the C# and the GDI+ technology based on verification code.
Key words: authentication code; GDI+; random number
目前,很多WEB程序为了防止不法分子恶意破解密码、批量注册,以破坏网站的稳定性,大都采用验证码技术。所谓验证码,就是把一串随机产生的数字或符号生成图片,并在图片里加上干扰,然后由用户连同其它表单信息,一齐提交给网站进行验证,验证成功后才能使用某功能。
1 技术原理
1.1 Random类
在C#中,通过Random类生成随机数,随机算法的起始数字是种子数,在种子数的基础上进行变换,最终产生需要的随机数。本文采用Random类的Next()方法(如表1所示)来返回随机数。
1.2 GDI+绘制技术
GDI+是.NET框架中提供二维图形、图像处理的功能,在较早GDI版本的基础上添加了新的功能并改进了现有功能,为开发者提供了一组实现与各种设备(如显示器、打印机等)进行交互的库函数。
Graphic类封装一个GDI+绘图图面。Graphic对象是用于创建图形图像的对象,Graphic类的DrawString()方法用于在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串。
2 实现过程
1) 启动VS 2010,新建一个C#的Windows窗体应用程序。在窗体中添加一个Button按钮和一个PictureBox控件,分别用于生成验证码和显示验证码。
2) 实现代码
(1) 生成4位由英文和数字组成的字符串
private static string CKCode()
{
int num;
char code;//存储每次生成的数字或字符
string verifyCode = ""; //存储随机数
Random random = new Random();
for (int i = 1; i <= 4; i++)
{
num = random.Next();
//判断随机数,若是偶数则存储数字,若是3的倍数则存储小写字母,否则存储大写字母
if(num%2==0)
code=(char)('0'+(char)(num%10));
else if(num%5==0)
code = (char)('a' + (char)(num % 26));
else
code = (char)('A' + (char)(num % 26));
verifyCode +=" "+ code.ToString();
}
return verifyCode;
}
(2) 将CKCode方法生成的字符串转化为Bitmap位图添加到PictureBox控件
private static Image CodeToPict(string verifyCode)
{
if (verifyCode == null || verifyCode.Trim() =="")
return null;
Bitmap img = new Bitmap((int)Math.Ceiling((verifyCode.Length*10.1)),26);
Graphics graphics = Graphics.FromImage(img);
Random random = new Random();
graphics.Clear(Color.White);
for (int i = 1; i <= 5; i++)//绘制噪音线
{
int x1=x2 = random.Next(img.Width);
int y1=y2= random.Next(img.Height);
graphics.DrawLine(new Pen(Color.Black),x1,y1,x2,y2);
}
Font font = new Font("Times New Roman ",16,(FontStyle.Bold));
graphics.DrawString(verifyCode,font,new SolidBrush(Color.Red),2,2);
for (int i = 0; i < 140; i++)//绘制噪音点
{
int x = random.Next(img.Width);
int y = random.Next(img.Height);
img.SetPixel(x,y,Color.FromArgb(random.Next()));
}
graphics.DrawRectangle(new Pen(Color. Gray), 0, 0, img.Width - 1, img.Height - 1);
return img;
}
运行效果如图1所示。
3 结束语
该文采用GDI+技术和C#程序语言完成了验证码的绘制,GDI+是对Windows操作系统GDI函数库的扩充,可以在窗体程序中产生很多自定义的图形,便于开发人员展示图形化的数据。
参考文献:
[1] William Stalling.密码编码学与网络安全[M].北京:电子工业出版社,2004.
[2] 耿肇英,赵建立.C#应用程序设计教程[M].北京:人民邮电出版社,2009.
[3] 明日科技.C#程序开发范例宝典[M].北京:人民邮电出版社,2010.
[4] 齐立波,黄俊伟.C#入门经典[M].6版.北京:清华大学出版社,2014.