博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)
阅读量:6689 次
发布时间:2019-06-25

本文共 2588 字,大约阅读时间需要 8 分钟。

  最近在写一个C#的项目,用户需求是实现Winform的多文档界面与Matlab算法程序之间的交互。做了一段时间发现,这既能利用业余时间,实战中也可学习一些技术,同时刚毕业也增加一份收入。所以后面会不断将期间的小知识总结成Blog,督促自己。

  今天解决了登陆时,用户名,密码的存储问题。本来想用数据库,例如轻量级的Access,但想了想,根据需求,只有用户名,密码需要保存,而且是单机版程序,只需保存管理员的账户信息。所以最终采用XML文件来保存用户信息,同时肯定不能明文直接保存其中,采用了MD5加密。

  由于C#中提供接口很丰富,这里实现也不难。

一. C#读/写XML文件,以及XML的设计

  保存用户名,密码,这里XML设计如下:

1 
2
3   
4   
5

  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

转载于:https://www.cnblogs.com/KevinSong/p/3523348.html

你可能感兴趣的文章
MySQL学习之如何快速扩展数量
查看>>
细说智能指针
查看>>
ssh: Could not resolve hostname guard.: Temporary
查看>>
跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)
查看>>
批量把本机的ssh密钥同步到远程设备以ssh无密码登入
查看>>
lmp+heartbeat+drbd
查看>>
2013年中国域名商报告:易名中国净增11.6万域名
查看>>
android ndk 的简单使用
查看>>
7月19日28家中国域名商六类国际域名注册保有量统计
查看>>
7月国内电脑分辨率TOP10 :1366*768跌破13%
查看>>
11月9日全球域名商解析新增量TOP10 :西部数码第七
查看>>
11月28日全球域名商保有量及市场份额排行榜TOP16
查看>>
.top域名总量15强:中国数据被赶超 阿里云晋身五强
查看>>
我的友情链接
查看>>
关于linux系统内核参数
查看>>
LoadRunner打印重定向状态码
查看>>
ios第一天
查看>>
nginx 代理缓存
查看>>
使用Kubeadm部署Kubernetes
查看>>
redis info信息详解A
查看>>