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

  今天解决了登陆时,用户名,密码的存储问题。本来想用数据库,例如轻量级的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(); 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 = ; i < byteMD5Hash.Length; i++)
{
strMD5Hash += byteMD5Hash[i];
} return strMD5Hash;
}

  此方法实现的是,对于输入的字符串,返回其MD5计算得到的散列值字符串。

  其实最初想用简单的加密方法,Base64,但后来听从同事意见,改用加密性更好的MD5方法,事实上,我也百度到一些网站,可以提供MD5的破解,当然一切还是以需求出发,对于小项目来说,个人觉得已满足需求。

三. 小结

  还是那句话,C#提供的接口非常丰富,这里实现的用户名密码的加密与存储,都是调用C#接口实现,网上参考文档较多,开发效率也高。这也说明,平时为客户做一些私下的项目,选用高级语言可以提高开发效率。

  前段时间公司事情多(准备年会,同时项目进入结尾期,几次都是深夜帮客户WebEx解决问题),导致最近一个月都没有写过博客,罪过罪过。自己还是很喜欢写博客。对于新人来讲,多总结平时接触到的知识,虽然很多并不难,网上资料也很多。但还是那句话,自己的收获总结出来,日积月累,技术上一定会越来越有收获。菜鸟继续加油:-)

  抛砖引玉,大家晚安。

Best Regards

Kevin Song

【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)的更多相关文章

  1. 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

    最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...

  2. 自身使用的springboot项目中比较全的pom.xml

    在学习的时候常建新的项目,mark下商用的jar <dependency> <groupId>org.mybatis</groupId> <artifactI ...

  3. python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为

    python接口自动化测试二十七:密码MD5加密   ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...

  4. 在java项目中怎样利用Dom4j解析XML文件获取数据

    在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...

  5. IDEA将Maven项目中src源代码下的xml配置文件编译进classes

    遇到这样的情况,maven项目启动报错,src中某个包下面的xml文件找不到. eclipse编译项目会自动将xml配置文件编译进classes,IDEA却不行 在报错项目的pom.xml文件中添加: ...

  6. vue项目中使用bpmn-流程图xml文件中节点属性转json结构

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  7. springMVC web项目 对访问数据库的用户名密码进行加密解密

    在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入.properties的变量,例如 在config.proper ...

  8. 1.关于QT中json数据处理和密码md5加密

     新建一个Qt空项目 17Json.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget ...

  9. 从项目中学习HTML+CSS

    最近由于工作原因以及自己的懈怠,已经很久都没有更新过博客了.通过这段时间,我发现坚持一件事情是真的很难,都说万事开头难,但是在放弃这件事上好像开头了后面就顺理成章的继续下去了.中间即使不怎么情愿也在努 ...

随机推荐

  1. 基础线程机制--Daemon,sleep(),yield()

    Daemon   守护线程是程序运行时在后台提供服务的线程,不属于程序中不可或缺的部分,当所有非守护进程执行完成时,程序也就终止,同时会杀死所有的守护进程.main()属于非守护线程.可以使用setD ...

  2. Le x820 的刷机记录

    一定要卡刷,如果用线刷,那些线刷宝等会内置好多应用. 卡刷的ROM包,都属于“民间包”,而官方的recovery,是不允许刷第三方包的.所以我们要先刷recovery.(刷入第三方recovery,还 ...

  3. Qt 学习之路 2(8):添加动作

    Home / Qt 学习之路 2 / Qt 学习之路 2(8):添加动作       [在WINDOWS10 QTCREATOR MENU添加无效]   Qt 学习之路 2(8):添加动作  豆子   ...

  4. spring boot app

    一个demo  可以参考一下 AppConfig @Configuration @ComponentScan(basePackages = { "org.whm.test" }) ...

  5. P2925 [USACO08DEC]干草出售Hay For Sale

    传送门 把每体积的干草价值看成一,就变成求最大价值 直接上背包就行了 注意优化常数 #include<iostream> #include<cstdio> #include&l ...

  6. 2015苏州大学ACM-ICPC集训队选拔赛(2)1002

    草爷要的雷 Problem Description 扫雷一直是风靡实验室的重要娱乐游戏,在赛前赛后.刷题疲惫的时候,扫一局雷经常可以让队员们感受到身心的振奋,毕竟,劳逸结合刷题,防猝死才是硬道理.但是 ...

  7. 在Javascript中 声明时用"var"与不用"var"的区别

    http://www.cnblogs.com/juejiangWalter/p/5725220.html var num = 0;function start() {    num = 3;} 只要一 ...

  8. Jenkins自动化CI CD流水线之3--参数化构建

    一. 背景 如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建.传参.项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但 ...

  9. docker(2)安装centos7镜像与容器管理

    1.镜像加速器 创建/etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn ...

  10. args 、kwargs不定参数通过列表、元组、字典传递

    *args .**kwargs是不定参数的表达方法,一般用于函数形参.*args .**kwargs 作为传递参数的函数,在使用过程中,可对*args .**kwargs多个输入,但是效率或者比较麻烦 ...