无视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;

//获取其它值

……