【摘 要】系統(tǒng)主要實現(xiàn)了通過網(wǎng)絡(luò)監(jiān)控,把通過郵件服務(wù)器的電子郵件進(jìn)行捕獲,解碼,并與用戶配置的關(guān)鍵字的檢索,從而檢測出那些郵件時涉及了保密信息的郵件,并且給系統(tǒng)配置的管理員發(fā)送短信或郵件預(yù)警。
【關(guān)鍵詞】TCP/IP JPCAP SMTP MIME JAVA
一、系統(tǒng)總體設(shè)計及實現(xiàn)
系統(tǒng)的設(shè)計分為4個模塊,其中網(wǎng)絡(luò)監(jiān)控模塊是通過對網(wǎng)卡數(shù)據(jù)包的捕獲,最終獲取到需要的SMTP協(xié)議數(shù)據(jù)報的原始郵件內(nèi)容。解析模塊就是針對獲取到的SMTP數(shù)據(jù)報進(jìn)行解析,根據(jù)MIME郵件定義的郵件頭和郵件體,并通過解碼,獲取到一個郵件對象,并放入郵件隊列,郵件過濾模塊會把把郵件隊列中的郵件進(jìn)行過濾,從而找到規(guī)則定義的郵件交給郵件處理模塊處理。
(一)網(wǎng)絡(luò)監(jiān)控
網(wǎng)絡(luò)監(jiān)控完成了網(wǎng)卡數(shù)據(jù)到SMTP協(xié)議數(shù)據(jù)的轉(zhuǎn)換。
1.網(wǎng)卡數(shù)據(jù)包捕獲
網(wǎng)絡(luò)監(jiān)控通過監(jiān)控郵件服務(wù)器上的網(wǎng)卡獲取所有通過網(wǎng)卡的數(shù)據(jù)報。網(wǎng)卡數(shù)據(jù)捕獲采用jpcap類庫實現(xiàn)。因為核心Java API不能訪問底層的網(wǎng)絡(luò)數(shù)據(jù),但Jpcap是一種提供在Windows或UNIX系統(tǒng)上進(jìn)行這種訪問的Java API。 Jpcap不是一種純粹的Java解決方案,它依賴本地庫的使用。在Windows 或 UNIX/LINUX上,必須依賴于第三方庫,分別是windows下的WinPcap或UNIX/LINUX下的libpcap。因為java的平臺無關(guān)性,采用jpcap類庫作為網(wǎng)卡數(shù)據(jù)的捕獲。
2.SMTP端口過濾
因為通過的網(wǎng)卡的數(shù)據(jù)很多,IP數(shù)據(jù)報直接去解析比較麻煩,但是jpcap提供了可以把IP數(shù)據(jù)報直接轉(zhuǎn)換為TCP/IP數(shù)據(jù)報的能力,據(jù)此,轉(zhuǎn)換為TCP/IP數(shù)據(jù)報之后,還需要對郵件發(fā)送所使用的協(xié)議進(jìn)行過濾,我們采用的過濾方式為端口的方式過濾。根據(jù)郵件發(fā)送原理,郵件發(fā)送采用SMTP協(xié)議,所用的端口為25,所以通過提取TCP/IP數(shù)據(jù)報的端口,過濾掉非25端口的數(shù)據(jù)報。至此,網(wǎng)絡(luò)監(jiān)控已經(jīng)實現(xiàn)了針對郵件服務(wù)器上郵件數(shù)據(jù)報的提取。
3.SMTP命令解析
根據(jù)端口過濾出來的SMTP命令有很多,所以我們需要把分析郵件的部分找出來。根據(jù)SMTP命令可知,當(dāng)發(fā)件方發(fā)送完DATA命令之后,下面發(fā)送的就是郵件的MIME格式正文部分,但是在實際的研究中發(fā)現(xiàn),如果同時發(fā)送接收多個郵件的情況下,這種方式還要判斷數(shù)據(jù)包的流向,更簡單的辦法是,F(xiàn)rom字符總會是MIME郵件的第一個字符,所以通過判斷From是否在字符的首位,就可以判斷是否是郵件的DATA命令之后的郵件正文,而不是其它的SMTP命令。
(二)郵件解析
通過對MIME域的分析,可以得到郵件的發(fā)件人(From域),收件人(To域),抄送人(Cc域),主題(Subject域),發(fā)送日期(Date域)等信息,并且可以從Content-Type域中知道當(dāng)前郵件的編碼方式是什么,一般中文郵件的編碼方式為GBK,GB2312,UTF-8等。然后就需要對郵件的正文部分進(jìn)行解析,郵件的發(fā)送采用multipart類型。一個郵件被分為N個部分,因為本文的目的是做郵件的監(jiān)控,所以,目前本文的范圍只對郵件的正文做關(guān)鍵字過濾,不再還原郵件的附件。所以重點還是針對Content-Type: multipart/alternative; boundary=\"{分段標(biāo)識}\"的部分進(jìn)行解析。當(dāng)這一部分的數(shù)據(jù)提取完成之后,還需要對郵件的正文進(jìn)行解碼操作,目前采用最多的編碼方式為Base64編碼。至此,完整的郵件內(nèi)容已經(jīng)解析出來。然后把解析到的郵件放到一個處理隊列中,并對隊列進(jìn)行實時的序列化處理。
(三)郵件過濾
1.關(guān)鍵字定義
關(guān)鍵字定義在系統(tǒng)的根目錄keyword.xml中,該xml就是關(guān)鍵字的定義結(jié)構(gòu),關(guān)鍵字可以有很多。郵件關(guān)鍵字規(guī)則定義如下xml所示。
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
資產(chǎn),源代碼,秘密
2.關(guān)鍵字匹配
通過關(guān)鍵字可對郵件進(jìn)行過濾,通過解析模塊解析出的郵件對象,通過重寫郵件對象的toString()方法,通過toString()方法和關(guān)鍵字的比較,如果出現(xiàn),則把郵件交給郵件處理模塊處理。
(四)郵件處理
通知模塊實現(xiàn)了對違規(guī)郵件隊列的監(jiān)聽,當(dāng)法相違規(guī)郵件隊列中放入了郵件之后,所有注冊的監(jiān)聽器把郵件進(jìn)行相應(yīng)的處理。
1.郵件處理監(jiān)聽器
目前實現(xiàn)的監(jiān)聽器有,郵件保存監(jiān)聽器,郵件發(fā)送監(jiān)聽器和短信發(fā)送監(jiān)聽器。
郵件發(fā)送監(jiān)聽器實現(xiàn)了把違規(guī)的郵件發(fā)送到指定的收件人的功能,郵件發(fā)送功能的實現(xiàn),采用了javamail的方式,沒有采用組成MIME格式的方式發(fā)送SMTP命令。
短信發(fā)送監(jiān)聽器實現(xiàn)了把違規(guī)的郵件通過短信的方式發(fā)送給指定的手機(jī),由于在實際的環(huán)境中,每個地方發(fā)送短信的方式都不相同,所以該部分的監(jiān)聽器是只有日志輸出,而不提供實際的短信發(fā)送功能,常見的短信發(fā)送方式有,短信網(wǎng)關(guān)的方式,webservice的方式,socket通信的方式。
郵件保存監(jiān)聽器是默認(rèn)的監(jiān)聽器,該監(jiān)聽器實現(xiàn)了違規(guī)郵件的持久化保存,以供后續(xù)的查詢,報表需求,目前的郵件保存監(jiān)聽器是把郵件保存成文本記錄存放在服務(wù)器硬盤上。
2.短信郵件監(jiān)聽器配置
短信和郵件監(jiān)聽器的主要結(jié)構(gòu)
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
配置通知 可選值為true或1,當(dāng)為true時表示啟動郵件或短信通知
配置短信發(fā)送的手機(jī)號碼,可以重復(fù)配置多個
二、系統(tǒng)的測試結(jié)果
(一)測試用例
如表5列舉了一些系統(tǒng)的測試用例,測試用例沒有全部列出,只列出了部分比較有代表性的測試用列。
(二)小結(jié)
雖然測試用例沒有全部列出,但軟件的設(shè)計已經(jīng)滿足了系統(tǒng)設(shè)計的目的。
參考文獻(xiàn):
[1] 謝希仁:《計算機(jī)網(wǎng)絡(luò)》, 電子工業(yè)出版社 2008年第5版
[2] 朱少民:《軟件測試方法和技術(shù)》 清華大學(xué)出版社 2010年7月第2版
[3] 梁勇、李娜:《Java語言程序設(shè)計》 機(jī)械工業(yè)出版社 2011年6月第8版
[4] 史蒂芬·約翰·梅特斯克(Steven John Metsker)、威廉·維克(William C.Wake)、張逸、史磊:《Java設(shè)計模式》電子工業(yè)出版社 2012年9月第2版
[5] 嚴(yán)蔚敏、吳偉民:《數(shù)據(jù)結(jié)構(gòu)(C語言版)》清華大學(xué)出版社 2011年7月
[6] 薩默維爾(Ian Sommerville)、程成:《軟件工程》 清華大學(xué)出版社 2011年5月
[7] 埃史爾、陳昊鵬:《Java編程思想》機(jī)械工業(yè)出版社2007年5月第4版
[8] 史蒂文斯(W.R.Stevens):《TCP/IP詳解卷1:協(xié)議》 機(jī)械工業(yè) 2000年4月
[9] 布萊恩特(Randal E.Bryant)、奧哈拉倫(David R.O’Hallaron)、龔奕利、雷迎春:《深入理解計算機(jī)系統(tǒng)》 機(jī)械工業(yè)出版社 2011年1月第2版
[10] 胡曉婭,曹連杰:《無線局域網(wǎng)背景下的電子郵件監(jiān)控系統(tǒng)研究》,計算機(jī)工程與科學(xué) 2012年第32卷第2期
[11] 百度百科:《SMTP》,http://baike.baidu.com/view/5450.htm
[12] 百度百科:《MIME郵件格式分析及信息提取》,http://www.studa.net/pc-Theory/080505/11033039-2.html