【從業餘項目中學習1】C# 實現XML存儲用戶名密碼(MD5加密)

  最近在寫一個C#的項目,用戶需求是實現Winform的多文檔界面與Matlab算法程序之間的交互。作了一段時間發現,這既能利用業餘時間,實戰中也可學習一些技術,同時剛畢業也增長一份收入。因此後面會不斷將期間的小知識總結成Blog,督促本身。node

  今天解決了登錄時,用戶名,密碼的存儲問題。原本想用數據庫,例如輕量級的Access,但想了想,根據需求,只有用戶名,密碼須要保存,並且是單機版程序,只需保存管理員的帳戶信息。因此最終採用XML文件來保存用戶信息,同時確定不能明文直接保存其中,採用了MD5加密。算法

  因爲C#中提供接口很豐富,這裏實現也不難。數據庫

一. C#讀/寫XML文件,以及XML的設計ide

  保存用戶名,密碼,這裏XML設計以下:學習

1 <?xml version="1.0" encoding="utf-8"?>
2 <UserInfo>
3   <UserName></UserName>
4   <Password></Password>
5 </UserInfo>

  C#程序讀取用戶名,密碼,以下:網站

  這裏讀取XML,用XmlTextReader類(System.Xml),XmlTextReader能提供以快速、單向、無緩衝的方式存取XML數據。單向就是將讀取數據時,要用Read()等方法由第一行依次向下讀取。因此這裏用While循環依次讀取XML中數據,遇到需求的節點,讀取節點的內容。this

 1 public void ReadUserInfoFromXML()
 2 {
 3     //建立一個XmlTextReader對象,讀取XML數據
 4     XmlTextReader xmlReader = new XmlTextReader("Data.xml");
 5 
 6     while (xmlReader.Read())
 7     {
 8         if (true == xmlReader.Name.Equals("UserName"))
 9         {
10             this.strUserName = xmlReader.ReadString().Trim();
11         }
12 
13         if (true == xmlReader.Name.Equals("Password"))
14         {
15             this.strPassword = xmlReader.ReadString().Trim();
16         }
17     }
18 
19     xmlReader.Close();
20 }

  既然有密碼,那就要容許用戶修改密碼,這裏提供的修改XML代碼以下:加密

 1 public void SaveNewPasswordToXml(string strNewPassword)
 2 {    
 3     XmlDocument xmlDoc = new XmlDocument();
 4 
 5     xmlDoc.Load("Data.xml");
 6 
 7     XmlNode node = xmlDoc.GetElementsByTagName("Password").Item(0);
 8 
 9     node.InnerText = strNewPassword;
10 
11     xmlDoc.Save("Data.xml");
12 }

  起初想用XmlTextReader對應的類XmlTextWriter,但後來發現用XmlDocument更方便,能夠直接選擇目標節點,修改它值的內容。spa

 

二. MD5加密 - 拒絕明文存儲用戶名/密碼設計

  MD5 - 即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。簡單的說,對於一個字符串,經過MD5計算其Hash值(散列值),有且只有一個。例如咱們將密碼,MD5計算散列值後,將散列值保存在XML中,當用戶登陸時,輸入的密碼,通過一樣的MD5算法計算,若是散列值與事先存儲的一致,則證實信息正確,容許用戶登陸。

  代碼以下:

 1 public string ComputeMD5Hash(string strSource)
 2 {
 3     string strMD5Hash = "";
 4 
 5     MD5 md5 = new MD5CryptoServiceProvider();
 6 
 7     byte[] byteSource = System.Text.Encoding.UTF8.GetBytes(strSource);
 8 
 9     byte[] byteMD5Hash = md5.ComputeHash(byteSource);
10 
11     for (int i = 0; i < byteMD5Hash.Length; i++)
12     {
13         strMD5Hash += byteMD5Hash[i];
14     }
15 
16     return strMD5Hash;
17 }

  此方法實現的是,對於輸入的字符串,返回其MD5計算獲得的散列值字符串。

  其實最初想用簡單的加密方法,Base64,但後來遵從同事意見,改用加密性更好的MD5方法,事實上,我也百度到一些網站,能夠提供MD5的破解,固然一切仍是以需求出發,對於小項目來講,我的以爲已知足需求。

 

三. 小結

  仍是那句話,C#提供的接口很是豐富,這裏實現的用戶名密碼的加密與存儲,都是調用C#接口實現,網上參考文檔較多,開發效率也高。這也說明,平時爲客戶作一些私下的項目,選用高級語言能夠提升開發效率。

  前段時間公司事情多(準備年會,同時項目進入結尾期,幾回都是深夜幫客戶WebEx解決問題),致使最近一個月都沒有寫過博客,罪過罪過。本身仍是很喜歡寫博客。對於新人來說,多總結平時接觸到的知識,雖然不少並不難,網上資料也不少。但仍是那句話,本身的收穫總結出來,日積月累,技術上必定會愈來愈有收穫。菜鳥繼續加油:-)

  拋磚引玉,你們晚安。

 

 

Best Regards

Kevin Song

相關文章
相關標籤/搜索