黃毅,楊朔,陳進(jìn)原,許錦才
摘 要: C#是可用于創(chuàng)建要運(yùn)行在.NET CLR上的應(yīng)用程序的語(yǔ)言之一。C#從C和C++語(yǔ)言演化而來(lái),是Microsoft專門為使用.NET平臺(tái)而創(chuàng)建的。MD5加密一般用于登錄驗(yàn)證或者數(shù)據(jù)庫(kù)密碼的存儲(chǔ)。文章對(duì)C#的WindowsForm編程和MD5加密作了簡(jiǎn)要介紹,然后通過(guò)WindowsForm編程實(shí)現(xiàn)了對(duì)MD5密碼加密的應(yīng)用,最后完成了所設(shè)計(jì)的業(yè)務(wù)流程。
關(guān)鍵詞: .NET CLR; MD5加密; 登錄驗(yàn)證; WindowsForm編程
中圖分類號(hào):TP391.1 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言
我們?cè)陂_發(fā)網(wǎng)站或登錄網(wǎng)站的時(shí)候,必定會(huì)考慮到個(gè)人信息保密的問(wèn)題,所以設(shè)置密碼和加密操作也是必須的?,F(xiàn)在最流行的加密算法曾被認(rèn)為是最安全的MD5算法,是一種不可逆的算法,對(duì)于密文幾乎不能還原成明文。倘若我們不對(duì)密碼進(jìn)行加密,數(shù)據(jù)的存儲(chǔ)方式就是以明文的形式存放的,別人很容易就能獲取密碼。本文對(duì)C# WindowsForm編程和MD5加密做了介紹,通過(guò)其相關(guān)技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了MD5相關(guān)加密的業(yè)務(wù)流程。
1 C# WindowsForm
自從.Net平臺(tái)發(fā)布(約2001年)以來(lái),基礎(chǔ)類庫(kù)中就包含了叫做Windows Forms(包含在用于構(gòu)建Ssytem.Windows.Form.dll程序集中)的API。Windows Form 由上百個(gè)類型(類、接口、結(jié)構(gòu)、枚舉和委托)組成,這些類型都分散在System.Windows.Form.dll程序集各種命名空間中,如圖1所示。
在System.Windows.Forms里的數(shù)百個(gè)類型可以分成以下幾個(gè)大類。
⑴ 核心架構(gòu):其展現(xiàn)了WindowsForms程序的核心操作。
⑵ 控件:這些類型用來(lái)建立圖形用戶界面。
⑶ 組件:可為Windows Forms提供可視特性,其在運(yùn)行時(shí)不可見,但在設(shè)計(jì)時(shí)可以被可視化配置。
⑷ 公共對(duì)話框:Windows Froms為公共操作提供了許多對(duì)話框[1]。
圖1 System.Windows.Forms.dll中的命名空間
在WindowsForm中,主要就是窗體的設(shè)計(jì)和相應(yīng)控件的應(yīng)用。通過(guò)對(duì)控件之間的合理組合就可以構(gòu)造出一個(gè)符合要求的窗體。常用的控件有:Button控件(按鈕),Label(標(biāo)簽),LinkLabel(鏈接標(biāo)簽),TextBox(文本框),RadioButton(單選按鈕),CheckBox(復(fù)選框)。在對(duì)于各種控件,其相應(yīng)的事件也很多,在本文中主要使用了Click事件即點(diǎn)擊事件。
2 MD5加密
MD5在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA Data Security Inc發(fā)明,經(jīng)過(guò)MD2、MD3、和MD4發(fā)展而來(lái)[2]。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被“壓縮”成一種保密格式(把一個(gè)任意長(zhǎng)度的字節(jié)串變換成一定長(zhǎng)的大整數(shù)),MD5最廣泛被用于各種軟件的密碼認(rèn)證和鑰匙識(shí)別上面,通俗地講是解釋人們所說(shuō)的序列號(hào)[3]。
2.1 MD5原理
Message-Digest泛指字節(jié)串的(Message)的Hash變換,也稱為單向散列函數(shù),解釋把一個(gè)任意長(zhǎng)度的“字符串”變換成一定長(zhǎng)的大整數(shù),這種變換只與字節(jié)的值有關(guān),與字符集或編碼方式無(wú)關(guān)。MD5將任意長(zhǎng)度的“字節(jié)串”變換成一個(gè)128bit的大整數(shù),并且它是一個(gè)不可逆的字符串變換算法。換言之,即使看到了源程序和算法描述,也無(wú)法將一個(gè)MD5的值變換回原始的字符串;從數(shù)學(xué)原理上說(shuō),是因?yàn)樵嫉淖址袩o(wú)窮多個(gè),這有點(diǎn)像不存在反函數(shù)的數(shù)學(xué)函數(shù)??梢钥闯鯩D5加密后是無(wú)法進(jìn)行解密的(也不是絕對(duì)的),例如一個(gè)string,利用MD5算法進(jìn)行加密后是無(wú)法將它還原為原來(lái)的string[4]。如果數(shù)據(jù)不采用任何算法進(jìn)行加密的話,數(shù)據(jù)的存儲(chǔ)方式是以明文形式存放的,意味著數(shù)據(jù)有很大的可能性被泄露,但是如果數(shù)據(jù)經(jīng)過(guò)加密,所看到的也只是一堆毫無(wú)排列順序的數(shù)字或字符。
2.2 MD5加密的效果
使用MD5加密有一個(gè)特點(diǎn),就是同一個(gè)string在同樣的編碼方式下加密的結(jié)果是一樣的,所以可以為任何文件產(chǎn)生一個(gè)獨(dú)一無(wú)二的“數(shù)字指紋”[5]。如圖2所示。
[string str][獨(dú)一無(wú)二的數(shù)字指紋][MD5加密
不可逆的]
圖2 MD5加密
加密后,一般取得的都是32位的字符或數(shù)字組成。通過(guò)加密后得到的密碼顯示如圖3所示。
圖3 密碼字符串加密
通過(guò)這一過(guò)程,存入數(shù)據(jù)庫(kù)的密碼信息,就是我們看到的那個(gè)繁瑣的字符串。當(dāng)然,在登錄的時(shí)候驗(yàn)證的也是那個(gè)字符串。
2.3 MD5加密實(shí)際應(yīng)用及安全性
MD5加密技術(shù)廣泛用于數(shù)字簽名領(lǐng)域,比如在發(fā)布軟件的時(shí)候,經(jīng)常會(huì)有一個(gè)文件擴(kuò)展名為.MD5的文件,這就是該軟件的數(shù)字簽名,MD5將整個(gè)文件當(dāng)作一個(gè)大文本信息。通過(guò)不可逆的字符串變換算法,產(chǎn)生了這個(gè)惟一的MD5信息摘要。在以后傳播這個(gè)文件的過(guò)程中,只要文件的內(nèi)容發(fā)生了任何形式的改變,其重新計(jì)算的MD5摘要信息就會(huì)不相同,由此,可以判斷文件是否被纂改。
MD5還廣泛用于加密保密信息上,如對(duì)于數(shù)據(jù)庫(kù)中的登錄密碼一般都是經(jīng)過(guò)MD5加密后存放的,當(dāng)?shù)卿洉r(shí),根據(jù)用戶填報(bào)的密碼生成相應(yīng)的MD5值與數(shù)據(jù)庫(kù)中的信息對(duì)比,從而判定登錄的合法性。
理論上任何一種加密算法都有其漏洞,但由于MD5的不可逆,使其具有一定的安全性。而從實(shí)際應(yīng)用的角度講,最大的隱患往往在使用者本身,而非加密技術(shù),在不斷探索更安全有效的加密手段的同時(shí)更需要用戶對(duì)密鑰使用的安全性。
3 流程設(shè)計(jì)
3.1 數(shù)據(jù)庫(kù)設(shè)計(jì)
對(duì)于數(shù)據(jù)庫(kù)的選取,我們選擇的是sql server2000。在數(shù)據(jù)庫(kù)構(gòu)建了一個(gè)表,取名為userinfo,其中的字段是:
id 賬號(hào)(主鍵)
password 密碼
name 姓名
對(duì)其中的password使用MD5加密算法對(duì)其加密。
3.2 服務(wù)器端設(shè)計(jì)
在服務(wù)器端存在著一個(gè)UserinfoDo類和Userinfo類,正因UserinfoDo這個(gè)類提供的各種關(guān)于數(shù)據(jù)庫(kù)的增刪改查方法,才能有如下兩個(gè)功能的實(shí)現(xiàn):一個(gè)是與用戶進(jìn)行信息交流;另一個(gè)是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。主要是接收從界面?zhèn)鱽?lái)的信息或者返回信息給界面,這之間都會(huì)與數(shù)據(jù)庫(kù)發(fā)生交互。Userinfo是對(duì)應(yīng)數(shù)據(jù)庫(kù)中的userinfo表而創(chuàng)建的一個(gè)類。
3.3 MD5加密設(shè)計(jì)
對(duì)于MD5加密,設(shè)計(jì)時(shí)創(chuàng)建一Md5use類,在里面創(chuàng)建一個(gè)Getmd5str(string str)的方法,參數(shù)即為要加密的密碼字符串,返回值為加密后的密碼,這樣在需要加密的時(shí)候,僅僅只需要調(diào)用一下這個(gè)方法即可。
3.4 客戶端端設(shè)計(jì)
這里我們給出窗口界面整體操作的大致流程,如圖4所示。
[登錄界面][MD5驗(yàn)證登錄](méi)[信息顯示][數(shù)據(jù)庫(kù)][用戶的相關(guān)操作][沒(méi)賬號(hào)][注冊(cè)界面][MD5加密]
圖4 總流程設(shè)計(jì)
3.4.1 登錄設(shè)計(jì)
登錄靠UserinfoLogin這個(gè)窗體來(lái)實(shí)現(xiàn),用戶輸入相應(yīng)的賬號(hào)密碼進(jìn)行登錄,如果密碼不對(duì)會(huì)有相應(yīng)的提示。對(duì)于沒(méi)有賬號(hào)的用戶可以進(jìn)入注冊(cè)窗口,如圖5所示。
[賬號(hào)][密碼][信息顯示][注冊(cè)][MD5加密驗(yàn)證] [成功登錄](méi) [登錄失敗] [(或重新輸入)]
圖5 登錄流程設(shè)計(jì)
當(dāng)?shù)卿浭『?,可以選擇重新登錄。
3.4.2 注冊(cè)設(shè)計(jì)
注冊(cè)靠Region這個(gè)窗體來(lái)實(shí)現(xiàn),使用者可以在此完成注冊(cè),其注冊(cè)的流程如圖6所示。
[賬號(hào)][密碼][名字][MD5加密][注冊(cè)][失敗][成功][賬號(hào)重復(fù)][返回登錄](méi)
圖6 注冊(cè)流程設(shè)計(jì)
在用戶注冊(cè)的時(shí)候,系統(tǒng)會(huì)自動(dòng)判斷賬號(hào)是否重復(fù)。
3.4.3 信息顯示設(shè)計(jì)
在登錄成功之后,信息顯示靠窗體Information來(lái)實(shí)現(xiàn),顯示相應(yīng)的用戶信息。其流程如圖7所示。
[登錄成功][信息顯示界面][密碼修改][賬號(hào)注銷][返回][返回登錄界面]
圖7 信息顯示設(shè)計(jì)
在信息顯示界面,用戶可以對(duì)自己的信息進(jìn)行修改,其對(duì)密碼的修改也仍會(huì)有MD5加密的過(guò)程。
4 相應(yīng)流程實(shí)現(xiàn)
4.1 服務(wù)器端的實(shí)現(xiàn)
服務(wù)器端的Userinfo類中定義了三屬性,分別是private的string _id,string _password,string _name。這是由對(duì)應(yīng)數(shù)據(jù)庫(kù)的表創(chuàng)建的。
在服務(wù)器端的UserinfoDo類中,定義的連接字符為:
private static string con="Data Source=HY-PC;
Initial Catalog=hy; User ID=sa";
在此類中,優(yōu)先聲明了以下幾個(gè)屬性:
private static SqlConnection conn; 表示一個(gè)連接
private static SqlCommand comm; 表示一個(gè)對(duì)象
private static SqlDataReader sdr;
private static UserInfo user;
在這個(gè)類中其相應(yīng)的方法有:
⑴ 構(gòu)造方法
public UserinfoDo()
{ conn=new SqlConnection(con);
conn.Open();
}
我們把創(chuàng)建連接放到其構(gòu)造方法中,是為了在初始化的時(shí)候,自動(dòng)創(chuàng)建連接。
⑵ 按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;
}
后面的代碼量過(guò)大,在此就不一一列舉。
⑶ 添加方法
public void addone(UserInfo user) {
……
}
⑷ 信息修改方法
public void updateone(UserInfo user) {
……
}
⑸ 刪除方法
public void deleteone(string m_id) {
……
}
4.2 MD5加密的實(shí)現(xiàn)
MD5加密是在一個(gè)Md5use類中的Getmd5str(string str)方法中實(shí)現(xiàn)的。其實(shí)現(xiàn)的過(guò)程如下:
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); } 注意編寫此代碼之前需要先導(dǎo)入包含算法的類: using System.Security.Cryptography; 4.3 登錄的實(shí)現(xiàn) 圖8為windows窗體的登錄窗口: 圖8 登錄窗口 當(dāng)密碼、賬戶或輸入信息不對(duì)時(shí)會(huì)跳出窗口,如圖9所示。 圖9 密碼錯(cuò)誤提示框 其相應(yīng)的驗(yàn)證即密碼加密的代碼如下: Md5use md5=new Md5use(); if(textBox1.Text.Trim()=="") MessageBox.Show("請(qǐng)輸入正確的賬號(hào)"); 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("請(qǐng)輸入正確的密碼"); } catch (Exception) MessageBox.Show("請(qǐng)仔細(xì)確認(rèn)賬號(hào)密碼"); } 當(dāng)?shù)卿洺晒髸?huì)進(jìn)入信息顯示界面,若失敗會(huì)給出相應(yīng)的提示。這些代碼都寫在登錄按鈕的點(diǎn)擊事件中。 4.4 注冊(cè)的實(shí)現(xiàn) 注冊(cè)界面如圖10所示。 圖10 注冊(cè)窗體 當(dāng)注冊(cè)成功或因ID重復(fù)注冊(cè)而失敗,都會(huì)有相應(yīng)的窗口提示。 代碼的實(shí)現(xiàn)如下: { ud=new UserinfoDo(); md5=new Md5use(); if (textBox1.Text.Trim()=="") MessageBox.Show("請(qǐng)輸入賬號(hào)"); else { try { ud.addone(new UserInfo(textBox1.Text,
md5.Getmd5str(textBox2.Text), textBox3.Text));
MessageBox.Show("注冊(cè)成功");
}
catch (Exception)
MessageBox.Show("賬號(hào)重復(fù)");
}
}
以上的代碼都寫在界面注冊(cè)按鈕的點(diǎn)擊事件中,其中md5.Getmd5str(textBox2.Text)就是為密碼加密。
4.5 信息顯示的實(shí)現(xiàn)
信息顯示界面,主要是顯示數(shù)據(jù)庫(kù)中的內(nèi)容,如圖11所示。
圖11 信息顯示窗體
從圖7中可以看到一些相應(yīng)的功能按鈕,當(dāng)進(jìn)行信息修改或用戶注銷的時(shí)候,都會(huì)在點(diǎn)擊后自動(dòng)回到登錄界面。相應(yīng)代碼實(shí)現(xiàn)如下:
確認(rèn)修改:{
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();
}
代碼都是寫在相對(duì)應(yīng)按鈕的點(diǎn)擊事件中。
5 結(jié)束語(yǔ)
MD5加密的不可逆性,使它在當(dāng)今加密領(lǐng)域被廣泛應(yīng)用。本文在介紹C#的WindowsForm編程和MD5加密相關(guān)知識(shí)的基礎(chǔ)上,探討了對(duì)MD5加密應(yīng)用的設(shè)計(jì)流程,其核心思想就是對(duì)用戶信息進(jìn)行存儲(chǔ)的MD5加密。通過(guò)多個(gè)Window窗口設(shè)計(jì)的實(shí)現(xiàn),逐步實(shí)現(xiàn)了整個(gè)流程的設(shè)計(jì)。相信MD5加密技術(shù)還會(huì)在以后不斷得到完善,并且有更廣泛的使用。
參考文獻(xiàn):
[1] Andrew Troelsen. C#與.net 4高級(jí)程序設(shè)計(jì)(第五版)[M].人民郵電
出版社,2011:1146-1147
[2] 桑海,李建寶.加密算法MD5的研究與應(yīng)用[J].華南金融電腦,
1999.7.
[3] 施衛(wèi)鋒,周俊,朱利剛.多戶住處系統(tǒng)中數(shù)據(jù)安全性控制機(jī)器及其實(shí)
現(xiàn)[J].微機(jī)發(fā)展,2003.1.
[4] 陳瑋.MD5加密原理及安全性分析[J].電腦知識(shí)與技術(shù),2007.19.
[5] 陳建熊,劉克勝;數(shù)據(jù)加密技術(shù)及其應(yīng)用[J].安徽電子信息職業(yè)技術(shù)
學(xué)院學(xué)報(bào),2004.Z1.