C#使用XmlEDocument实现数据文件安全存储功能

来源:互联网 发布:python split函数用法 编辑:程序博客网 时间:2024/06/15 20:21

本文讲解C#使用XmlEDocument来实现象QQ记录登录过用户名、密码等信息的安全性。
类似QQ登录窗口的帐号输入框,这种数据的本地存储

可以把要考虑安全性因素的信息以XML的格式写入内存流中(因为XML操作非常方便),再把整个内存流中加密,保
存成文件(扩展名就无谓了,可以不用.xml,你可以用.dat、.db显得专业点,哈哈)。想到这里,就开始动手,为了提高代码的重用率
,把XmlDocument自己封装一下,取名XmlEDocument。
代码如下:
 Code [http://www.xueit.com] 1 using System.Collections.Generic;
 2 using System.IO;
 3 using System.Security.Cryptography;
 4 using System.Text;
 5 using System.Xml;
 6
 7 namespace DotNet.Common
 8 {
 9     public class XmlEDocument : XmlDocument
10     {
11         private const string ENCR_KEY = "zhuxiaoc";
12         private const int READ_SIZE = 16*1024;
13
14         public override void Load(string filename)
15         {
16             var fileStream = new FileStream(filename, FileMode.Open);
17             Load(fileStream);
18         }
19
20         public override void Load(Stream inStream)
21         {
22             var bsXml = new List<byte>();
23             var b = new byte[READ_SIZE];
24             int iLength;
25             while ((iLength = inStream.Read(b, 0, READ_SIZE)) > 0)
26             {
27                 for (int i = 0; i < iLength; i  )
28                 {
29                     bsXml.Add(b[i]);
30                 }
31             }
32             inStream.Close();
33             var msEXml = new MemoryStream();
34             var des = new DESCryptoServiceProvider();
35             byte[] byKey = Encoding.UTF8.GetBytes(ENCR_KEY.Substring(0, 8));
36             byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
37             var cs = new CryptoStream(msEXml, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
38             cs.Write(bsXml.ToArray(), 0, bsXml.ToArray().Length);
39             cs.FlushFinalBlock();
40             base.Load(new MemoryStream(msEXml.ToArray()));
41         }
42
43         public override void Save(string filename)
44         {
45             if(!File.Exists(filename))
46                 File.Create(filename).Close();
47
48             var fileStream = new FileStream(filename, FileMode.Truncate);
49             Save(fileStream);
50             fileStream.Close();
51         }
52
53         public override void Save(Stream outStream)
54         {
55             var msXml = new MemoryStream();
56             base.Save(msXml);
57             var des = new DESCryptoServiceProvider();
58             byte[] byKey = Encoding.UTF8.GetBytes(ENCR_KEY.Substring(0, 8));
59             byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
60             var cs = new CryptoStream(outStream, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
61             cs.Write(msXml.ToArray(), 0, msXml.ToArray().Length);
62             cs.FlushFinalBlock();
63             msXml.Close();
64         }
65     }
66 }写个简单的例子吧:

这是创建XML
 Code [http://www.xueit.com]1 var xmlDocument = new XmlDocument();
2 var dec = xmlDocument.CreateXmlDeclaration("1.0", "utf-8", null);
3 xmlDocument.AppendChild(dec);
4 var root = xmlDocument.CreateElement("Users");
5 xmlDocument.AppendChild(root);
6 xmlDocument.Save("c://test.xml");
这是创建加密的XML
 Code [http://www.xueit.com]1 var xmlEDocument = new XmlEDocument();
2 var dec = xmlEDocument.CreateXmlDeclaration("1.0", "utf-8", null);
3 xmlEDocument.AppendChild(dec);
4 var root = xmlEDocument.CreateElement("Users");
5 xmlEDocument.AppendChild(root);
6 xmlEDocument.Save("c://test.dat");


代码写法完全一样,达到效果确是完全不同。


原创粉丝点击