Data Security 也意味著 Keys Security,使用 Model-View-Controller (MVC) model 實作 Key management 提使用者能以簡易的動作對金鑰做有效管理。
4.3.1 金鑰管理 MVC model
圖 4 - 5是系統實作出的Key Management MVC model:
圖 4 - 5 金鑰管理 MVC model
Model
以KeyObject的Field變數 (4.2小節) 組成,存放系統當下Cipher與 Secret Keys的設定。除了algorithmName Field為一固定值外,使用者透 過GUI介面做設定時內容將會更新,而decryptPair只在檔案儲存時記錄 每個欄位的加密設定
View
將 Model 內容以 GUI 顯示。View 會根據 Model 的狀態變更目前顯示,
若有新增或移除等資料修改,Model 元件在內容更新後會重新繪製 View 元件
Controller
編輯資料時會觸發事件由 Controller 進行 Model 元件的更新。透過 GUI
做資料的修改系統會發出 ActionEvent 的事件,Controller 元件接收此 事件後更新 Model 中相對應的欄位
使用MVC架構能夠降低對金鑰管理的負擔,使用者選定加密目標欄位後可 對於Cipher與Secret Key進行設定。如圖 4 - 5的View元件中的視窗所示,使用下 拉式選單選定要使用的Cipher後,可在其下方的另一下拉式選單選擇要使用的 Key。若要進行Key的新增/刪除/更新,僅需點選“Key” Button後再做相對的設定 即可。GUI的顯示由Model元件目前內容所決定,若有變更會即時更新顯示。
4.3.2 金鑰設定
選擇 Key 的下拉式選單中顯示的內容僅為作為代表的 Key Label,在檔案 儲存時系統會在 KeyObject 的 keyPairVec Field 中以 getDecryptPair() Method 找 出相對應的 Secret Key。Key 的新增可以設定喜好的 Key Label 名稱,Controller 元件在接收新增 Key 的事件後會對此 Key Label 自動 Generate 一個對應於選擇 Cipher 的 Secret Key,再將此 KeyLabel-SecretKey pair 以 addDecryptPair() Method 新增至 Model 中。相同的,Key 的 Refresh 也是系統在接到更新 Key 事件後,
對 於 選 擇 的 Key Label 重 新 Generate 一 個 新 的 Secret Key , 並 且 呼 叫 setDecryptPair() Method 做資料更新。要注意的是,系統對各 Cipher 提供一 Default Key Label,對應的 Secret Key 則是 User Password 透過 MD5 Hash Function 產生的 Byte Array 所建立;此 Default Key Label 無法進行更新,只有 在變更 User Password 或是 Default Cipher 時由系統自動更新。
4.3.3 加密設定記錄
decryptPair Field以PairUtil的自訂型態記錄資料欄位加密/解密的設定。如圖 4 - 6,PairUtil是以ArrayList< String[] >型態的pairArr Field實作。
圖 4 - 6 PairUtil
儲存檔案將加密使用的 Cipher-SecretKey 儲存至二維 String Array 後依序加 入 ArrayList。讀取檔案則反向操作依序取出 pairArr Field 中的 Cipher-SecretKey pair 設定,並依序解密資料欄位。
4.3.4 金鑰匯出
KeyObject 藉由 implements Serializable Interface,先以 ObjectOutputStream 輸出為暫存檔形式儲存至磁碟,再依照 mainAlgorighm 與 mainKey64 Field 的設 定將暫存檔加密成為 Key-File。反的來說,使用 Key-File 解密 Database 時,需 要先選擇系統解密使用的 Cipher 以及輸入 User Password,若正確無誤則可解開 Key-File 檔 案 成 為 暫 存 檔 形 式 , 再 藉 由 ObjectInputStream 重 新 建 構 成 KeyObject。Database 的讀取需要取得 KeyObject 的 decryptPair Field 做欄位的解 密。
圖 4 - 7 Key Export 結果
Key Export的機制為,能夠藉由選擇Cipher和Key Label來決定Export的 Key-File具有哪些欄位的保密功能。圖 4 - 7的例子為我們對於Cipher Blowfish 且Key值為Default時,希望此欄位受到保護,而輸出的結果也如圖所示,第二 列為不顯示內容的資料。
圖 4 - 8 Key Export 機制
如圖 4 - 8,實作此機制的方法是,額外使用跟KeyObject keyPairVec Field 擁 有 相 同 結 構 的 Vector< HashMap<String, Boolean> > , 把 HashMap<String, String>原本的KeyLabel-SecretKey pair複製一份為KeyLabel-isNull pair形式儲 存。isNull的Default值也就是原本的Secret Key,不做任何設定Export的Key-File 即可解開原本Database所有資料欄位;若有隱藏欄位的設定,isNull欄位將會塞 入null。系統在匯出decryptPair時向此複製的KeyLabel-isNull pair詢問Cipher與 Secret Key,並且將值寫入。而下次使用此設定匯出的金鑰讀取Database時,會 忽略所有decryptPair內金鑰欄位值為null的帳戶資訊,便完成了保護欄位的目 的。