C# WindowsForm编程中MD5加密的设计与实现
2013-04-29黄毅,杨朔,陈进原,许锦才
黄毅,杨朔,陈进原,许锦才
摘 要: C#是可用于创建要运行在.NET CLR上的应用程序的语言之一。C#从C和C++语言演化而来,是Microsoft专门为使用.NET平台而创建的。MD5加密一般用于登录验证或者数据库密码的存储。文章对C#的WindowsForm编程和MD5加密作了简要介绍,然后通过WindowsForm编程实现了对MD5密码加密的应用,最后完成了所设计的业务流程。
关键词: .NET CLR; MD5加密; 登录验证; WindowsForm编程
中图分类号:TP391.1 文献标志码:A 文章编号:1006-8228(2013)06-09-04
Design and implementation of MD5 cryptographic in C# WindowsForm programming
Huang Yi1, Yang Shuo2, Chen Jinyuan2, Xu Jincai2
(1. Hangzhou Dianzi University, Hangzhou, Zhejiang 310018, China; 2. Zhejiang Topcheer Information Technology Co.,Ltd)
Abstract: C# is one of computer languages which can be used to create one kind application programs running on the .NETCLR. It is evolved from the C and the C++ languages and created by Microsoft for the .Net platform. MD5 encryption is commonly used for login validation and storage of database passwords. In this paper, WindowsForm programming of C# and MD5 encryption are introduced roughly. The application of MD5 password encryption is realized through WindowsForm programming. Finally the design of business process is completed.
Key words: .NET CLR; MD5 encryption; login validation; WindowsForm programming
0 引言
我们在开发网站或登录网站的时候,必定会考虑到个人信息保密的问题,所以设置密码和加密操作也是必须的。现在最流行的加密算法曾被认为是最安全的MD5算法,是一种不可逆的算法,对于密文几乎不能还原成明文。倘若我们不对密码进行加密,数据的存储方式就是以明文的形式存放的,别人很容易就能获取密码。本文对C# WindowsForm编程和MD5加密做了介绍,通过其相关技术,设计并实现了MD5相关加密的业务流程。
1 C# WindowsForm
自从.Net平台发布(约2001年)以来,基础类库中就包含了叫做Windows Forms(包含在用于构建Ssytem.Windows.Form.dll程序集中)的API。Windows Form 由上百个类型(类、接口、结构、枚举和委托)组成,这些类型都分散在System.Windows.Form.dll程序集各种命名空间中,如图1所示。
在System.Windows.Forms里的数百个类型可以分成以下几个大类。
⑴ 核心架构:其展现了WindowsForms程序的核心操作。
⑵ 控件:这些类型用来建立图形用户界面。
⑶ 组件:可为Windows Forms提供可视特性,其在运行时不可见,但在设计时可以被可视化配置。
⑷ 公共对话框:Windows Froms为公共操作提供了许多对话框[1]。
图1 System.Windows.Forms.dll中的命名空间
在WindowsForm中,主要就是窗体的设计和相应控件的应用。通过对控件之间的合理组合就可以构造出一个符合要求的窗体。常用的控件有:Button控件(按钮),Label(标签),LinkLabel(链接标签),TextBox(文本框),RadioButton(单选按钮),CheckBox(复选框)。在对于各种控件,其相应的事件也很多,在本文中主要使用了Click事件即点击事件。
2 MD5加密
MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经过MD2、MD3、和MD4发展而来[2]。它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密格式(把一个任意长度的字节串变换成一定长的大整数),MD5最广泛被用于各种软件的密码认证和钥匙识别上面,通俗地讲是解释人们所说的序列号[3]。
2.1 MD5原理
Message-Digest泛指字节串的(Message)的Hash变换,也称为单向散列函数,解释把一个任意长度的“字符串”变换成一定长的大整数,这种变换只与字节的值有关,与字符集或编码方式无关。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。换言之,即使看到了源程序和算法描述,也无法将一个MD5的值变换回原始的字符串;从数学原理上说,是因为原始的字符串有无穷多个,这有点像不存在反函数的数学函数。可以看出MD5加密后是无法进行解密的(也不是绝对的),例如一个string,利用MD5算法进行加密后是无法将它还原为原来的string[4]。如果数据不采用任何算法进行加密的话,数据的存储方式是以明文形式存放的,意味着数据有很大的可能性被泄露,但是如果数据经过加密,所看到的也只是一堆毫无排列顺序的数字或字符。
2.2 MD5加密的效果
使用MD5加密有一个特点,就是同一个string在同样的编码方式下加密的结果是一样的,所以可以为任何文件产生一个独一无二的“数字指纹”[5]。如图2所示。
[string str][独一无二的数字指纹][MD5加密
不可逆的]
图2 MD5加密
加密后,一般取得的都是32位的字符或数字组成。通过加密后得到的密码显示如图3所示。
图3 密码字符串加密
通过这一过程,存入数据库的密码信息,就是我们看到的那个繁琐的字符串。当然,在登录的时候验证的也是那个字符串。
2.3 MD5加密实际应用及安全性
MD5加密技术广泛用于数字签名领域,比如在发布软件的时候,经常会有一个文件扩展名为.MD5的文件,这就是该软件的数字签名,MD5将整个文件当作一个大文本信息。通过不可逆的字符串变换算法,产生了这个惟一的MD5信息摘要。在以后传播这个文件的过程中,只要文件的内容发生了任何形式的改变,其重新计算的MD5摘要信息就会不相同,由此,可以判断文件是否被纂改。
MD5还广泛用于加密保密信息上,如对于数据库中的登录密码一般都是经过MD5加密后存放的,当登录时,根据用户填报的密码生成相应的MD5值与数据库中的信息对比,从而判定登录的合法性。
理论上任何一种加密算法都有其漏洞,但由于MD5的不可逆,使其具有一定的安全性。而从实际应用的角度讲,最大的隐患往往在使用者本身,而非加密技术,在不断探索更安全有效的加密手段的同时更需要用户对密钥使用的安全性。
3 流程设计
3.1 数据库设计
对于数据库的选取,我们选择的是sql server2000。在数据库构建了一个表,取名为userinfo,其中的字段是:
id 账号(主键)
password 密码
name 姓名
对其中的password使用MD5加密算法对其加密。
3.2 服务器端设计
在服务器端存在着一个UserinfoDo类和Userinfo类,正因UserinfoDo这个类提供的各种关于数据库的增删改查方法,才能有如下两个功能的实现:一个是与用户进行信息交流;另一个是对数据库进行操作。主要是接收从界面传来的信息或者返回信息给界面,这之间都会与数据库发生交互。Userinfo是对应数据库中的userinfo表而创建的一个类。
3.3 MD5加密设计
对于MD5加密,设计时创建一Md5use类,在里面创建一个Getmd5str(string str)的方法,参数即为要加密的密码字符串,返回值为加密后的密码,这样在需要加密的时候,仅仅只需要调用一下这个方法即可。
3.4 客户端端设计
这里我们给出窗口界面整体操作的大致流程,如图4所示。
[登录界面][MD5验证登录][信息显示][数据库][用户的相关操作][没账号][注册界面][MD5加密]
图4 总流程设计
3.4.1 登录设计
登录靠UserinfoLogin这个窗体来实现,用户输入相应的账号密码进行登录,如果密码不对会有相应的提示。对于没有账号的用户可以进入注册窗口,如图5所示。
[账号][密码][信息显示][注册][MD5加密验证] [成功登录] [登录失败] [(或重新输入)]
图5 登录流程设计
当登录失败后,可以选择重新登录。
3.4.2 注册设计
注册靠Region这个窗体来实现,使用者可以在此完成注册,其注册的流程如图6所示。
[账号][密码][名字][MD5加密][注册][失败][成功][账号重复][返回登录]
图6 注册流程设计
在用户注册的时候,系统会自动判断账号是否重复。
3.4.3 信息显示设计
在登录成功之后,信息显示靠窗体Information来实现,显示相应的用户信息。其流程如图7所示。
[登录成功][信息显示界面][密码修改][账号注销][返回][返回登录界面]
图7 信息显示设计
在信息显示界面,用户可以对自己的信息进行修改,其对密码的修改也仍会有MD5加密的过程。
4 相应流程实现
4.1 服务器端的实现
服务器端的Userinfo类中定义了三属性,分别是private的string _id,string _password,string _name。这是由对应数据库的表创建的。
在服务器端的UserinfoDo类中,定义的连接字符为:
private static string con="Data Source=HY-PC;
Initial Catalog=hy; User ID=sa";
在此类中,优先声明了以下几个属性:
private static SqlConnection conn; 表示一个连接
private static SqlCommand comm; 表示一个对象
private static SqlDataReader sdr;
private static UserInfo user;
在这个类中其相应的方法有:
⑴ 构造方法
public UserinfoDo()
{ conn=new SqlConnection(con);
conn.Open();
}
我们把创建连接放到其构造方法中,是为了在初始化的时候,自动创建连接。
⑵ 按ID查询
public UserInfo findone(string id) {
string sql=string.Format("select*from userinfo where id={0}",id);
comm=new SqlCommand(sql,conn);
sdr=comm.ExecuteReader();
using(sdr) {
while (sdr.Read())
{ string m_id=(string)sdr["id"];
string m_password=(string)sdr["password"];
string m_name=(string)sdr["name"];
user=new UserInfo(m_id, m_password, m_name);
}
}
return user;
}
后面的代码量过大,在此就不一一列举。
⑶ 添加方法
public void addone(UserInfo user) {
……
}
⑷ 信息修改方法
public void updateone(UserInfo user) {
……
}
⑸ 删除方法
public void deleteone(string m_id) {
……
}
4.2 MD5加密的实现
MD5加密是在一个Md5use类中的Getmd5str(string str)方法中实现的。其实现的过程如下:
public string Getmd5str(string str) {
string laststr=null;
MD5 md5=new MD5CryptoServiceProvider();
byte[] fromdata=System.Text.Encoding.Unicode.GetBytes(str);
byte[] todata=md5.ComputeHash(fromdata);
for (int i=0; i laststr+=todata[i].ToString("X"); return laststr.Substring(0,31); } 注意编写此代码之前需要先导入包含算法的类: using System.Security.Cryptography; 4.3 登录的实现 图8为windows窗体的登录窗口: 图8 登录窗口 当密码、账户或输入信息不对时会跳出窗口,如图9所示。 图9 密码错误提示框 其相应的验证即密码加密的代码如下: Md5use md5=new Md5use(); if(textBox1.Text.Trim()=="") MessageBox.Show("请输入正确的账号"); else { ud=new UserinfoDo(); try { user=ud.findone(textBox1.Text); if (user.Password==md5.Getmd5str(textBox2.Text) &&user.Id==textBox1.Text) { ud=new UserinfoDo(); information infor=new information(this); this.Hide(); infor.ShowDialog(); } else MessageBox.Show("请输入正确的密码"); } catch (Exception) MessageBox.Show("请仔细确认账号密码"); } 当登录成功后会进入信息显示界面,若失败会给出相应的提示。这些代码都写在登录按钮的点击事件中。 4.4 注册的实现 注册界面如图10所示。 图10 注册窗体 当注册成功或因ID重复注册而失败,都会有相应的窗口提示。 代码的实现如下: { ud=new UserinfoDo(); md5=new Md5use(); if (textBox1.Text.Trim()=="") MessageBox.Show("请输入账号"); else { try { ud.addone(new UserInfo(textBox1.Text,
md5.Getmd5str(textBox2.Text), textBox3.Text));
MessageBox.Show("注册成功");
}
catch (Exception)
MessageBox.Show("账号重复");
}
}
以上的代码都写在界面注册按钮的点击事件中,其中md5.Getmd5str(textBox2.Text)就是为密码加密。
4.5 信息显示的实现
信息显示界面,主要是显示数据库中的内容,如图11所示。
图11 信息显示窗体
从图7中可以看到一些相应的功能按钮,当进行信息修改或用户注销的时候,都会在点击后自动回到登录界面。相应代码实现如下:
确认修改:{
md5=new Md5use();
uf.ud.updateone(new UserInfo(uf.user.Id,
md5.Getmd5str(textBox1.Text),textBox2.Text));
MessageBox.Show("信息修改成功,重新登录");
UserinfoLogin login=new UserinfoLogin();
this.Hide();
login.ShowDialog();
}
注销ID:{
uf.ud.deleteone(uf.user.Id);
UserinfoLogin login=new UserinfoLogin();
this.Hide();
login.ShowDialog();
}
返回登录:{
UserinfoLogin login=new UserinfoLogin();
this.Hide();
login.ShowDialog();
}
代码都是写在相对应按钮的点击事件中。
5 结束语
MD5加密的不可逆性,使它在当今加密领域被广泛应用。本文在介绍C#的WindowsForm编程和MD5加密相关知识的基础上,探讨了对MD5加密应用的设计流程,其核心思想就是对用户信息进行存储的MD5加密。通过多个Window窗口设计的实现,逐步实现了整个流程的设计。相信MD5加密技术还会在以后不断得到完善,并且有更广泛的使用。
参考文献:
[1] Andrew Troelsen. C#与.net 4高级程序设计(第五版)[M].人民邮电
出版社,2011:1146-1147
[2] 桑海,李建宝.加密算法MD5的研究与应用[J].华南金融电脑,
1999.7.
[3] 施卫锋,周俊,朱利刚.多户住处系统中数据安全性控制机器及其实
现[J].微机发展,2003.1.
[4] 陈玮.MD5加密原理及安全性分析[J].电脑知识与技术,2007.19.
[5] 陈建熊,刘克胜;数据加密技术及其应用[J].安徽电子信息职业技术
学院学报,2004.Z1.