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


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

  今天解決了登陸時,用戶名,密碼的存儲問題。本來想用數據庫,例如輕量級的Access,但想了想,根據需求,只有用戶名,密碼需要保存,而且是單機版程序,只需保存管理員的賬戶信息。所以最終采用XML文件來保存用戶信息,同時肯定不能明文直接保存其中,采用了MD5加密。

  由於C#中提供接口很豐富,這里實現也不難。

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

  保存用戶名,密碼,這里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中數據,遇到需求的節點,讀取節點的內容。

 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更方便,可以直接選擇目標節點,修改它值的內容。

 

二. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM