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