无视app.config,用序列化加密、解密反序列化自行存取程序设置
来源:互联网 发布:深圳正大数据恢复中心 编辑:程序博客网 时间:2024/05/17 22:42
新浪微博爬虫(http://code.google.com/p/sinawler/)终于基本完成了。
做下来一个,觉得其实做这种基于API的APP开发,重要的还是想法。API就这些,都摆在这了,就看你能想到用它们来干嘛。
这里想说一下自己实现的程序设置信息的读取。
ASP.NET程序有个web.config,是个XML文件,数据库连接字符串什么的都往里面放,配合.NET中的System.Configuration,可以很方便地对里面的数据进行存取。基于窗口的Winform程序,也有个相应的app.config,道理一样,使用一样。
然而,这里有个问题了:ASP.NET程序是网站,web.config放在服务器上,一般不容易获取,所以里面保存的数据相对安全;可是app.config是要跟随应用程序发布给客户终端的,客户随时都可以查看、修改里面的数据,这样一来,数据库的登录帐号、密码什么的一目了然,其它的一些配置信息,也很容易被篡改,造成程序运行故障。因此,就想到抛弃app.config,何不自己实现配置文件并且将其加密呢?
思路很简单:用序列化保存,保存之前将序列化后得到的字节流加密;用反序列化读取,反序列化之前将读取的字节流解密。
具体实现:
一、SettingItems类,用来保存各个配置信息项。
当然,可以根据需要,任意设定。但是注意,前面一定要有[Serializable],因为这个类是要被序列化、反序列化操作的。
二、AppSettings类,以实现对SettingItems类实例的保存(序列化加密)和加载(解密序列化)
这里用到了加密解密,一会儿再说。这里要说的是一个困扰了我很久的问题。
之前用StreamWriter和StreamReader操作,总是无法解密。后来发现,这两个类操作的是字符串,这会导致字节流中的一些字节无法解析出来,从而导致错误,最终导致加密解密的失败。后来,改成了FileStream操作。
还有一个问题,也需要注意。
在序列化时,byte[] arrEncryptByte = Serialize.EncryptToBytes(settings);这样一句,得到的字节数组长度没到1024,大概有二三百。但是在反序列化时,由于预先不知道字节流的长度,所以只能用byte[] arrByte = new byte[1024];来定义一个足够大的。这样的结果,也导致读取出来的结果与之前保存的不一样(多了好多为0的字节),解密会失败。因此,最终在保存时,先用4个字节保存一下字节流的长度,读取时先读取长度,再根据长度将指定长度的字节流复制出来,这样才能得到之前保存的真正密文。
当然,如果数据量很大(一般配置信息不会有多大吧?),1024这个值可能不够。
三、Serialize类,序列化加密、解密反序列化
这里要说的是密码(password)要固定,因为加密解密都用它。另外这里用的DES,它的key需要时8个字节。
当然,可以选用其它的对称加密算法。
四、最后是两个将整数与4个元素的字节数组互相转换的函数:
//整数到字节数组的转换
五、使用举例
保存:
SettingItems settings=new SettingItems();
settings.DBName="hello";
//设置其它值
……
AppSettings.Save(settings);
加载:
SettingItems settings=AppSettings.Load();
if(settings==null) settings=AppSettings.LoadDefault();
txtDBName.Text=settings.DBName;
//获取其它值
……
- 无视app.config,用序列化加密、解密反序列化自行存取程序设置
- 序列化加密/反序列化解密
- 对象加密成文件,解密成对象 (读取字节法,不用序列化 反序列化)
- Json.Net序列化和反序列化设置
- 序列化反序列化
- 序列化 反序列化
- 序列化反序列化
- 序列化反序列化
- 序列化、反序列化
- 序列化、反序列化
- 序列化/反序列化
- 序列化/反序列化
- 序列化反序列化
- 序列化,反序列化
- 序列化,反序列化
- 序列和反序列化
- 万能序列,反序列化
- 序列和反序列化
- ARM 起步之一 U-boot makefile分析(转载)
- Log4j的配置【转】
- C#与数据结构--树论--平衡二叉树(AVL Tree)
- H264学习指南
- vlc学习计划(4)--VLC程序宏及线程分析
- 无视app.config,用序列化加密、解密反序列化自行存取程序设置
- chkdsk命令的使用
- vlc学习计划(5)--网络数据流接收处理过程分析
- 呵呵
- vlc学习计划(6)--从接收到数据流到播放视频的过程分析
- 字符串处理函数大全
- 在RedHat Linux Enterprise5上安装Oracle10g时遇到的问题
- 敏捷开发笔记
- Log4j1.2 --- 死锁