当前位置: 首页 > news >正文

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

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

相关文章:

  • 利用jquery和jsonp来获取跨站数据,并实现cookie共享
  • BIND+DLZ智能解析系统
  • 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样
  • 去掉JAVA部分依赖的事例
  • JPPF并行计算框架类加载机制研究
  • ASP.NET MVC 5 -从控制器访问数据模型
  • Spark(四) -- Spark工作机制
  • jquery获取表格中特定列
  • 20155222 《信息安全系统设计基础》课程总结
  • bzoj 1067 特判
  • 【实验】修改数据文件名字的三种途径
  • 开发中的版本问题(2)—配置tomcat使用特定的jdk版本
  • 枚举格式化字符串
  • 安装CentOS 6停在selinux-policy-targeted卡住的问题解决
  • DB_NAME,DB_UNIQUE_NAME 和 SID 的理解
  • JavaScript实现分页效果
  • java正则表式的使用
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • npx命令介绍
  • PHP那些事儿
  • Redis学习笔记 - pipline(流水线、管道)
  • SQLServer插入数据
  • tensorflow学习笔记3——MNIST应用篇
  • 大整数乘法-表格法
  • 对象管理器(defineProperty)学习笔记
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 七牛云假注销小指南
  • 什么是Javascript函数节流?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)(1.13) SiK无线电高级配置(六)
  • (175)FPGA门控时钟技术
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Note)C++中的继承方式
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (七)理解angular中的module和injector,即依赖注入
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)虚函数剖析
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 中的轻量级线程安全
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net访问oracle数据库性能问题
  • .NET开发人员必知的八个网站