【从业余项目中学习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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

Redis 3.0.0正式版发布,全新的分布式高可用数据库

38770
来自专栏Windows Community

Windows Phone 8.1 新特性 - 常用的启动器

本篇为大家介绍一下 Windows Phone 8.1 中部分常用启动器的实现方式。分别是 呼叫电话、发送短信、发送邮件、添加约会到日历、启动地图、地图路线显示...

26250
来自专栏机器学习和数学

[编程经验] 我是如何半自动抓取素材公社图片的

网络爬虫是一件比较繁琐的事情,特别考验人的耐心。但又是非常令人着迷的一件事,因为当你从网络上爬到了自己的想要的数据,满满的成就感油然而生。但是我对爬虫掌握的并不...

35950
来自专栏腾讯云API

【视频】腾讯云API使用指南

云API团队在云学院上线了一套视频教程,目的是和大家分享如何进行API、SDK和CLI的使用。

844100
来自专栏北京马哥教育

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

19600
来自专栏张善友的专栏

基于DotNetOpenAuth实现OpenID 服务提供者

EverBox网盘(www.everbox.com)是由盛大创新院推出的一款网盘产品,提供了超大的免费存储空间(可升级到 10GB),支持文件同步、文件分享、在...

354100
来自专栏牛客网

快手Java开发面经(2技术面)

如果你要做一件事,请不要炫耀,也不要宣扬,只管安安静静的去做。因为那是你自己的事,别人不知道你的情况,也不可能帮你去实现。千万不要因为虚荣心而炫耀。也不要因为别...

69620
来自专栏北京马哥教育

Linux | 只有十三个字符的经典Fork炸弹,讨厌谁就去整他吧!

Jaromil在2002年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在shell中运行后几秒后系统就会宕机: 这样看起来不是很好理解...

46160
来自专栏Java后端技术栈

【面试题】2018年最全Java面试通关秘籍第五套!

注:本文是从众多面试者的面试经验中整理而来,其中不少是本人出的一些题目,网络资源众多,如有雷同,纯属巧合!禁止一切形式的碰瓷行为!未经允许禁止一切形式的转载和复...

18210
来自专栏施炯的IoT开发专栏

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

    早在今年的BUILD大会上,诺基亚就宣布了SensorCore以及它的部分演示。今天,它终于面世了,大家可以去Building Apps for Win...

28270

扫码关注云+社区

领取腾讯云代金券