【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)
2014-01-16 23:32
316 查看
最近在写一个C#的项目,用户需求是实现Winform的多文档界面与Matlab算法程序之间的交互。做了一段时间发现,这既能利用业余时间,实战中也可学习一些技术,同时刚毕业也增加一份收入。所以后面会不断将期间的小知识总结成Blog,督促自己。
今天解决了登陆时,用户名,密码的存储问题。本来想用数据库,例如轻量级的Access,但想了想,根据需求,只有用户名,密码需要保存,而且是单机版程序,只需保存管理员的账户信息。所以最终采用XML文件来保存用户信息,同时肯定不能明文直接保存其中,采用了MD5加密。
由于C#中提供接口很丰富,这里实现也不难。
一. C#读/写XML文件,以及XML的设计
保存用户名,密码,这里XML设计如下:
C#程序读取用户名,密码,如下:
这里读取XML,用XmlTextReader类(System.Xml),XmlTextReader能提供以快速、单向、无缓冲的方式存取XML数据。单向就是将读取数据时,要用Read()等方法由第一行依次向下读取。所以这里用While循环依次读取XML中数据,遇到需求的节点,读取节点的内容。
既然有密码,那就要允许用户修改密码,这里提供的修改XML代码如下:
起初想用XmlTextReader对应的类XmlTextWriter,但后来发现用XmlDocument更方便,可以直接选择目标节点,修改它值的内容。
二. MD5加密 - 拒绝明文存储用户名/密码
MD5 - 即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。简单的说,对于一个字符串,通过MD5计算其Hash值(散列值),有且只有一个。例如我们将密码,MD5计算散列值后,将散列值保存在XML中,当用户登录时,输入的密码,经过同样的MD5算法计算,如果散列值与事先存储的一致,则证明信息正确,允许用户登录。
代码如下:
此方法实现的是,对于输入的字符串,返回其MD5计算得到的散列值字符串。
其实最初想用简单的加密方法,Base64,但后来听从同事意见,改用加密性更好的MD5方法,事实上,我也百度到一些网站,可以提供MD5的破解,当然一切还是以需求出发,对于小项目来说,个人觉得已满足需求。
三. 小结
还是那句话,C#提供的接口非常丰富,这里实现的用户名密码的加密与存储,都是调用C#接口实现,网上参考文档较多,开发效率也高。这也说明,平时为客户做一些私下的项目,选用高级语言可以提高开发效率。
前段时间公司事情多(准备年会,同时项目进入结尾期,几次都是深夜帮客户WebEx解决问题),导致最近一个月都没有写过博客,罪过罪过。自己还是很喜欢写博客。对于新人来讲,多总结平时接触到的知识,虽然很多并不难,网上资料也很多。但还是那句话,自己的收获总结出来,日积月累,技术上一定会越来越有收获。菜鸟继续加油:-)
抛砖引玉,大家晚安。
Best Regards
Kevin Song
今天解决了登陆时,用户名,密码的存储问题。本来想用数据库,例如轻量级的Access,但想了想,根据需求,只有用户名,密码需要保存,而且是单机版程序,只需保存管理员的账户信息。所以最终采用XML文件来保存用户信息,同时肯定不能明文直接保存其中,采用了MD5加密。
由于C#中提供接口很丰富,这里实现也不难。
一. C#读/写XML文件,以及XML的设计
保存用户名,密码,这里XML设计如下:
<?xml version="1.0" encoding="utf-8"?> <UserInfo> <UserName></UserName> <Password></Password> </UserInfo>
C#程序读取用户名,密码,如下:
这里读取XML,用XmlTextReader类(System.Xml),XmlTextReader能提供以快速、单向、无缓冲的方式存取XML数据。单向就是将读取数据时,要用Read()等方法由第一行依次向下读取。所以这里用While循环依次读取XML中数据,遇到需求的节点,读取节点的内容。
public void ReadUserInfoFromXML() { //创建一个XmlTextReader对象,读取XML数据 XmlTextReader xmlReader = new XmlTextReader("Data.xml"); while (xmlReader.Read()) { if (true == xmlReader.Name.Equals("UserName")) { this.strUserName = xmlReader.ReadString().Trim(); } if (true == xmlReader.Name.Equals("Password")) { this.strPassword = xmlReader.ReadString().Trim(); } } xmlReader.Close(); }
既然有密码,那就要允许用户修改密码,这里提供的修改XML代码如下:
public void SaveNewPasswordToXml(string strNewPassword) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("Data.xml"); XmlNode node = xmlDoc.GetElementsByTagName("Password").Item(0); node.InnerText = strNewPassword; xmlDoc.Save("Data.xml"); }
起初想用XmlTextReader对应的类XmlTextWriter,但后来发现用XmlDocument更方便,可以直接选择目标节点,修改它值的内容。
二. MD5加密 - 拒绝明文存储用户名/密码
MD5 - 即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。简单的说,对于一个字符串,通过MD5计算其Hash值(散列值),有且只有一个。例如我们将密码,MD5计算散列值后,将散列值保存在XML中,当用户登录时,输入的密码,经过同样的MD5算法计算,如果散列值与事先存储的一致,则证明信息正确,允许用户登录。
代码如下:
public string ComputeMD5Hash(string strSource) { string strMD5Hash = ""; MD5 md5 = new MD5CryptoServiceProvider(); byte[] byteSource = System.Text.Encoding.UTF8.GetBytes(strSource); byte[] byteMD5Hash = md5.ComputeHash(byteSource); for (int i = 0; i < byteMD5Hash.Length; i++) { strMD5Hash += byteMD5Hash[i]; } return strMD5Hash; }
此方法实现的是,对于输入的字符串,返回其MD5计算得到的散列值字符串。
其实最初想用简单的加密方法,Base64,但后来听从同事意见,改用加密性更好的MD5方法,事实上,我也百度到一些网站,可以提供MD5的破解,当然一切还是以需求出发,对于小项目来说,个人觉得已满足需求。
三. 小结
还是那句话,C#提供的接口非常丰富,这里实现的用户名密码的加密与存储,都是调用C#接口实现,网上参考文档较多,开发效率也高。这也说明,平时为客户做一些私下的项目,选用高级语言可以提高开发效率。
前段时间公司事情多(准备年会,同时项目进入结尾期,几次都是深夜帮客户WebEx解决问题),导致最近一个月都没有写过博客,罪过罪过。自己还是很喜欢写博客。对于新人来讲,多总结平时接触到的知识,虽然很多并不难,网上资料也很多。但还是那句话,自己的收获总结出来,日积月累,技术上一定会越来越有收获。菜鸟继续加油:-)
抛砖引玉,大家晚安。
Best Regards
Kevin Song
相关文章推荐
- 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)
- 黑马程序员之C#编程基础学习笔记:用while break实现要求用户输入用户名和密码,只要不是admin,888888就一直提示要求重新输入。
- c#与JavaScript实现对用户名、密码进行RSA非对称加密
- Windows Phone 8 学习志(探索问题一:如何简单利用Windows Phone Runtime Component项目类型实现C#和C++交互)
- c#学习之-c#通过sql存储过程实现分页
- Android学习(19) -- 数据存储之File (简单登录保存用户名和密码)
- 浅谈:如何用C#实现简单的带有验证码及密码使用MD5加密的“登录”WinForm小程序
- Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
- 黑马程序员之C#编程基础学习笔记:提示用户输入用户名,然后再提示输入密码,如果用户名是"admin"并且密码是“888888”,则提示正确,否则提示错误,如果用户名不是admin还提示用户用户名不存在
- c#项目中可以用xml文件存储配置参数
- C#温故而知新学习系列之XML编程—NET的DOM实现(四)
- C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮【转载】
- 实现前端MD5加密与记住用户名密码功能
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- 使用C#获取远程图片 Form用户名与密码Authorization认证的实现
- C#实现XML文件数据库存储
- c#与JavaScript实现对用户名、密码进行RSA非对称加密
- C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮
- 温习ASP调用C#的DLL并实现用户名密码进行域验证反馈结果
- C#温故而知新学习系列之XML编程—4-NET的DOM实现