無視app.config,用序列化加密、解密反序列化自行存取程序設置

    新浪微博爬蟲(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;

//獲取其它值

……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章