蘇恒陽
(廣東輕工職業(yè)技術學院,廣州 510300)
隨著安全技術的不斷發(fā)展和成熟,數(shù)字簽名技術被廣泛應用于電子商務、金融、政治等領域,成為保護個人隱私的重要技術手段。在安全領域,數(shù)字簽名保證了數(shù)據(jù)的完整性、不可抵賴性,而日志系統(tǒng)對于安全來說,同樣非常重要。日志系統(tǒng)可以記錄系統(tǒng)使用者的操作記錄,可以通過它來檢查錯誤發(fā)生的原因,或者受到攻擊時攻擊者留下的痕跡。數(shù)字簽名和日志系統(tǒng)二者結合可以實現(xiàn)數(shù)據(jù)的安全記錄。
用戶通過注冊建立自己的個人信息,登錄以后可以通過用戶管理,進行用戶信息的修改。用戶注冊后就建立其個人文件夾,得到一定大小的用戶空間,可以存儲用戶上傳的文件。用戶通過文件管理功能,可以進行文件的上傳和刪除操作。同時,用戶還可以共享上傳的文件。用戶還可以通過消息管理給其他用戶發(fā)送消息,通過備忘錄管理書寫備忘錄。

圖1 用戶操作功能切換圖
用戶注冊后建立自己的個人信息,用注冊過的用戶名和密碼,用戶可以登錄系統(tǒng)。
用戶注冊之后,可以用注冊的帳號的密碼登入系統(tǒng),在登錄視圖填寫登錄信息,把登入請求提交給登錄控制器,控制器調用DataStore驗證信息,并把驗證的結果返回給用戶,驗證通過則進入系統(tǒng),驗證失敗則提示失敗信息。
在系統(tǒng)中,采用了4個業(yè)務類ClientManagement、ClientFilemanagement、ClientMessage 和 Client-Remind分別來提供用戶信息管理、用戶文件管理、用戶消息管理和用戶備忘錄管理,同時通過控制器ChooseAction進行功能切換。Login.jsp視圖中輸出4個鏈接的選項,分別對應4個主要的用戶功能。用戶通過點擊不同的鏈接可以選擇不同的功能。
1.2.1 用戶信息管理功能
用戶管理功能主要由業(yè)務類Clientmanagement來實現(xiàn)。用戶從用戶管理頁面中點擊修改用戶個人信息鏈接,調用控制器ModifyAction,ModifyAction提供了重定向功能,使用戶進入修改用戶信息視圖。在修改信息視圖中填寫要修改的用戶信息,然后提交給信息修改控制器ModifySubmitAction,該控制器經過相應的驗證后通過調用DataStore完成修改,保存修改的信息,并把修改的結果返回給用戶功能視圖。
1.2.2 用戶文件管理功能
進入用戶文件管理,可以進行用戶文件查看、新文件上傳以及文件刪除操作。上傳的文件存儲在用戶注冊時分配到的空間。
用戶進入上傳文件的視圖,選擇要上傳的文件,然后把上傳的請求交給上傳控制器,上傳控制器調用數(shù)據(jù)庫類DataStore執(zhí)行上傳文件的操作,執(zhí)行文件表和文件空間表的插入和更新操作,并把上傳結果返回給用戶,顯示在用戶文件列表上。上傳成功則顯示文件上傳成功界面,上傳失敗,則提示出錯。
用戶共享操作可以和其他用戶共享自己上傳的文件,進入共享文件列表可以查看各個用戶共享的文件,并可以根據(jù)需要進行下載。同時,用戶可以進行撤銷共享操作,對于沒有設置共享的文件,只有上傳該文件的用戶可以查看該文件。用戶還可以刪除自己上傳的文件,操作流程和共享文件類似。
1.2.3 用戶消息功能
消息業(yè)務類為用戶提供發(fā)送和刪除消息的功能,進入消息管理界面,用戶可以給其他用戶發(fā)送消息。
用戶可以在自己的消息頁面中查看其他用戶發(fā)送給自己的消息,并且可以刪除沒有用的消息。刪除消息不需要填寫表單,直接將請求提交給刪除控制器RemoveMessageAction,調用DataStore從數(shù)據(jù)庫中刪除信息。
1.2.4 用戶備忘錄功能
進入備忘錄管理界面,用戶可以添加新的備忘錄。控制器對用戶填寫的表單信息進行驗證,驗證出錯則返回輸出錯誤信息,驗證通過則將備忘錄信息存入數(shù)據(jù)庫,并將結果返回給用戶。同時,用戶可以刪除過期的備忘錄。
系統(tǒng)為管理員提供了登錄、注銷、查看用戶信息,刪除用戶信息,查看用戶操作日志和查找文件的功能。
管理員登錄之后,通過AdminLogAction控制器調用searchClient()方法從數(shù)據(jù)庫中循環(huán)讀出每一個用戶的信息,并將用戶信息保存在Vector中,然后將Vector中的用戶信息存到session中。控制器最后返回到視圖頁面,視圖頁面從session中獲取用戶信息,放入Vector中,然后從Vector循環(huán)讀出每一個用戶的信息,顯示在頁面上,管理員即可瀏覽用戶信息。
點擊進入日志系統(tǒng),管理員可以進入查看用戶的操作日志。通過LogSys控制器,調用Log類中寫好的searchLog()方法,從數(shù)據(jù)庫中讀出數(shù)據(jù)。最后轉發(fā)到getLog.jsp頁面上,將日志顯示出來。
系統(tǒng)中用戶的操作日志只有管理員可以進行查看。為了實現(xiàn)日志信息的記錄,并使每個操作的日志記錄都可以調用同一個類,實現(xiàn)代碼的復用,專門寫了一個日志信息記錄的類Log.java。Log.java中包含了日志信息的數(shù)字簽名、日志讀取和記錄日志的操作。

圖 2 日志系統(tǒng)功能圖
當用戶進入系統(tǒng)進行操作時,包括用戶的登錄、文件操作、注銷和用戶信息修改等,日志系統(tǒng)都會記錄相應的日志信息。根據(jù)MVC模式,用戶的每次操作都由表單記錄相應的信息、參數(shù),通過模型收集信息,并將其傳送給控制器Action進行處理。在每次動作的執(zhí)行就會產生相應的操作日志信息,將信息作為參數(shù),并調用Log類中的signLog()對日志信息進行數(shù)字簽名,得出簽名的結果。將操作信息和簽名的結果作為參數(shù)傳給Log類的recordLog()方法,在每次動作的最后調用該方法,產生用戶操作的一條完整的日志信息,將這些信息存入到數(shù)據(jù)庫中。同時,調用然后將日志信息寫入到數(shù)據(jù)庫中,簽名的結果同樣也保存在數(shù)據(jù)庫中。
3.2.1 非對稱密鑰對的產生
系統(tǒng)中利用非對稱密鑰加密算法進行數(shù)字簽名, 首先必須完成的工作就是密鑰對的生成。Java中的KeyPairGenertor類提供了創(chuàng)建用于非對稱加密的密鑰對的方法,密鑰對創(chuàng)建好后封裝在KeyPair類型的對象中。具體過程如下:
1)創(chuàng)建密鑰對生成器
首先,通過工廠類KeyPairGenerator的靜態(tài)方法getInstance()生成一個KeyPairGenerator 類的對象,傳入的參數(shù)為非對稱加密所使用的算法,常用的有RSA、DSA等,這里使用RSA算法。
KeyPairGenerator KeyGen = KeyPairGenerator.getInstance(“RSA”);
2)初始化密鑰對生成器
通過KeyPairGenerator類中的initialize初始化,傳入的兩個參數(shù)為強度和隨機數(shù)源,強度一般為1024,隨機數(shù)源由SecureRandom類的對象自動生成一個原始值。
KeyGen.initialize( 1024, new SecureRandom());
3)生成密鑰對
將生成的密鑰對保存在KeyPair 類的一個實例中,其中包含了一對公鑰和私鑰的信息。
KeyPair kpair = KeyGen.genKeyPair();
4)獲取公鑰和私鑰
publicKey pbkey = kpair.getPublic();privatekey prkey = kpair.getPrivate();
將生成的密鑰對保存好,用戶操作時利用私鑰對日志信息進行加密,然后將簽名和日志信息一起存入數(shù)據(jù)庫。管理員要查看日志時,用公鑰進行驗證簽名。
3.2.2 使用私鑰對日志信息進行數(shù)字簽名
日志信息產生后,利用MD5強加密消息散列算法對信息計算消息摘要,然后利用RSA非對稱加密算法進行數(shù)字簽名。Java.security包中的Signature類提供了進行數(shù)字簽名的方法。Signature對象的initSign()方法傳入私鑰,執(zhí)行update()方法可以將原始數(shù)據(jù)傳遞給Signature對象,然后執(zhí)行sign()方法即可得到消息驗證碼。具體過程如下:
1)獲取要簽名的數(shù)據(jù)
用戶的每一次系統(tǒng)操作都將產生操作記錄,將用戶的用戶名、操作類型、操作的文件名、操作時間,作為一條操作記錄,存在message.dat文件中,通過文件輸入流將其讀入字節(jié)類型數(shù)組data中。
FileInputStream f = new FileInputStream(“message.dat”);
int num = f.available();
byte[] data = new byte[num];
f.read(data);
2)獲取私鑰
生成的私鑰保存在private_key.dat文件中,通過文件流讀入私鑰存放在RSAPrivateKey類型的變量中,用于加密日志信息。
FileInputStream f2 = new FileInputStream(“private_key.dat”);
objectInputStream b = new ObjectInputStream(f2);
RSAPrivateKey prk = (RSAPrivateKey)b.read-Object();
3)獲取Signature對象
通過Signature的getInstance()方法獲取對象,方法的參數(shù)指定了簽名所用的算法,包含了計算消息摘要所用的算法和加密消息摘要所用的算法。系統(tǒng)中使用的是MD5和RSA算法。
Signature s = Signature.getInstance(“MD5withRSA”);
4)用私鑰初始化Signature對象
使用Signature對象的initSign()方法初始化Signature對象,參數(shù)為加密使用的私鑰,以后就可以用此加密日志信息。
s.initSign(prk);
5)傳入要數(shù)字簽名的數(shù)據(jù)
將保存在data數(shù)組中的用戶操作信息傳入,進行數(shù)字簽名。
s.update(data);
6)執(zhí)行數(shù)字簽名簽名
byte[] signdata = s.sign();
簽名之后,得到的簽名信息是二進制代碼,通過編碼類將二進制的信息轉化成String類型,然后將String類型的簽名結果保存在日志信息表中,以便于日志查看時進行驗證。
BASE64Encoder base64Encoder = new BASE64Encoder();
String sign = base64Encoder.encode(signeddata);
管理員通過登錄,可以進入日志系統(tǒng),查看日志信息。為了驗證日志信息有沒有被修改,需要對記錄日志時產生的數(shù)字簽名進行驗證。當管理員進行查看時,觸發(fā)控制器LogSysAction,該控制器從數(shù)據(jù)庫中讀出操作信息,并調用Log類中的checkSign()方法,利用公鑰對簽名進行驗證,即對簽名過的信息進行解密,將解密過的結果和原始信息進行對比,對比結果一致說明驗證通過,不一致說明驗證沒有通過。驗證結果同時顯示在頁面上,Check Pass表示通過驗證,即日志信息沒有被修改過;Check Fail表示沒有通過驗證,即日志信息已經被修改過。
日志系統(tǒng)提供給管理員按用戶查看日志信息的功能。管理員輸入用戶名,日志系統(tǒng)可以將該用戶的操作日志顯示出來。
日志系統(tǒng)中,提供利用Java安全機制實現(xiàn)了數(shù)字簽名,對于用戶的操作日志簽名保證了日志信息的完整性,及時了解日志信息是否被修改。
對于系統(tǒng)中用戶包括管理員的身份認證,用戶權限以及用戶操作的授權管理方面等可以做一進步的工作,使得系統(tǒng)的安全性更強。
[1] Cay S. Horstmann, GaryCornell. 王建華, 董志敏, 楊保明, 等譯. Java核心技術 卷II[M]. 北京: 機械工業(yè)出版社,2005.
[2] Jim D’Anjou, Dan Kehn, John Kellerman, 等. 束堯, 丁凡,許國梁, 譯. Eclipse權威開發(fā)指南[M]. 北京: 清華大學出版社, 2006.
[3] Joseph Schmuller. 李虎, 趙龍剛, 譯. UML基礎、案例與應用[M]. 北京: 人民郵電出版社, 2005.
[4] Vivek Chopra, Jon Eaves, Rupert Jones, 等. 朱濤江, 張文靜, 等譯. JSP高級程序設計[M]. 北京: 人民郵電出版社,2006.
[5] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. 楊冬青, 唐世渭, 等譯. 數(shù)據(jù)庫系統(tǒng)概念[M]. 北京: 機械工業(yè)出版社.
[6] Revist R L, Shamir A, Adleman L. A method for obtaining digital signatures and public-key cryptosystems[J].Communications of the ACM, 1978, 21(2): 120-126.
[7] 徐迎曉. Java安全性編程實例[M]. 北京: 清華大學出版社, 2003.
[8] Christopher Steel, Ramesh Nagappan, RayLai. 陳秋萍, 羅鄧, 袁國忠, 等譯. 安全模式[M]. 北京: 機械工業(yè)出版社,2006.
[9] 肖文, 尹建偉, 陳剛, 等. 基于J2EE的日志管理中間件的設計和實現(xiàn)[J]. 計算機應用研究, 2003, (10): 173-175.
[10] 劉泉, 吳濤. 基于Java的數(shù)字簽名研究與實現(xiàn)[J]. 武漢理工大學學報, 2004, 26(1): 11-14.