文松,王敏,程虹
(湖北文理學院計算機工程學院,襄陽441053)
對于企業用戶來說,使用自有電子郵件系統有助于提高企業信息安全水平,同時也更方便用于數據分析和對外展示良好的企業形象。James 是Apache 軟件基金會發布的開源軟件[1],提供了對基本郵件功能的支持,如POP3 協議、SMTP 協議、IMAP 協議、文件和數據庫訪問等功能[2],這種設計允許開發者能夠快速開發出功能全面的郵件程序[3],可用于作為電子郵件系統的郵件服務器。但James 只有郵件系統功能,用戶只能通過telnet 才能使用,顯然不能滿足企業需要。更重要的是,James 只實現了標準的郵件收發功能,郵件是明文保存,如果有黑客訪問到了郵件數據,則企業機密面臨暴露的風險。為此,基于James 設計并實現了帶Web系統的加密電子郵件系統。
在文獻[4]中,提出了一種能夠應用于互聯網的企業電子郵件系統。該系統實現了一個子系統,并且集成在企業原有信息化系統中,作為一個電子郵件的組件。文獻[5]則采用James 郵件服務器直接部署郵件,還把常用的MySQL 數據庫替換成了Oracle 數據庫,以滿足更高性能的要求。然而這些系統并沒有考慮郵件加密問題。攻擊者只要對James 有一定的了解,就可以將郵件攔截下來,經過簡單的反編破解,就能獲取郵件的原文信息。針對這些問題,基于James 的安全電子郵件系統的主要功能包括:
(1)電子郵件服務器,支持POP3 協議、SMTP 協議、IMAP 協議;
(2)電子郵件服務器支持對數據庫和文件的訪問,用以訪問用戶和郵件;
(3)系統采用B/S 結構,使用瀏覽器作為郵件收發的客戶端;
(4)系統能夠對電子郵件自動加密,黑客獲取了電子郵件之后,無法解密。
電子郵件系統主要包含網頁前端用戶操作請求以及后臺對用戶請求作出相應的請求響應服務二部分構成。功能模塊主要分為:用戶注冊模塊、用戶登錄模塊、郵箱主界面模塊以及用戶注銷模塊四個大部分,其中用戶郵箱主界面包含用戶的所有業務邏輯流程項目。用戶注冊模塊包括用戶注冊功能;用戶登錄模塊包括用戶登錄功能;郵箱主界面模塊包括用戶信息、寫郵件、收件箱、草稿箱、發件箱、已刪除等功能;用戶注銷模塊主要實現退出郵件系統,并清空所有用戶瀏覽信息,已標記為刪除的郵件此時會從服務器刪除,無法恢復;后臺服務主要是與瀏覽器的用戶請求進行交互,處理用戶請求的相關業務,并將處理的結果返回給用戶。系統主要功能模塊如圖1 所示。

圖1 系統主要功能模塊圖
由于James 支持MySQL 數據庫,可以在MySQL 中保存用戶、郵件等數據,因此需要在MySQL 中創建相應的表。但作為整個郵件系統而言,不應該允許郵件使用者直接操作這些表,而且有些郵件系統用戶不一定會是郵件使用者,例如:系統管理員不應該把自己的管理賬號直接作為郵件賬號。因此,需要建立郵件系統的用戶表,該表與James 所用的用戶表應該區分開。根據這些要求,設計以下用表。
(1)郵箱用戶信息表(users)
此表為James 郵件服務器使用的表,其中字段包括:username:為用戶注冊的郵箱賬號用戶名(不包括郵箱后綴,即郵件域名);pwdHash:為用戶的密碼,此密碼為James 郵件服務器自動加密后的;pwdAlgorithm:加密算法;useForwarding:是否啟用郵件轉發;forwardDestination:郵件轉發目的地;useAlias:為是否啟用郵箱別名;alias:郵箱用戶別名。
(2)用戶基本信息表(user)
此表為用戶的基本信息表,用以注冊時填寫注冊信息,其中主要字段是username:為郵箱用戶的賬號名,既是本表的主鍵,也是users(郵箱用戶信息表)的外鍵,另外還有一些用戶個人信息。
(3)郵件詳情表(inbox)
此表也是James 郵件服務器使用的數據表,其中字段包括:message_name:為一封郵件的消息名標識,是服務器上的一個唯一標識;repository_name:源名稱,即消息來源的名稱;message_state:消息狀態,即消息所處于的權限狀態;error_message:錯誤消息,在消息發送出錯時,存儲錯誤信息;sender:消息發送人;recipients:消息接受人;remote_host:遠程主機,即郵件服務器的域名;remote_addr:遠程地址,即郵件服務器的IP 地址;message_body:消息體,即整條消息的正文和附件等等主體內容;message_attributes:消息的屬性,消息的各項屬性信息即存在這項里面;last_updated:消息的上次更新時間,在每次對郵件信息進行修改之后,都會更新為當前時間。
(4)郵件標志表(mail_flag)
此表為郵件標志表,與inbox 一起關聯查詢區分郵件中的草稿郵件、刪除郵件、已發送、已接收郵件等等。最主要的字段是message_name,為此表主鍵,也是inbox 表的外鍵,通過此鍵值相等來進行關聯查詢,獲取相應的查詢結果。
(5)郵件信息表(mail)
此表為后臺郵件處理的信息表,從前端接收郵件信息然后經過后臺加密和其他的一系列處理轉化成James 郵件服務器能夠發送的郵件,或是從James 郵件服務器中查找出來郵件,然后經過解碼得到郵件詳情存儲在此表中,在傳輸到前臺顯示給用戶查看。
(6)密鑰表(rsakey)
此表為算法所生成密鑰,用戶在注冊時,根據用戶的用戶名自動生成相應的公私鑰,并存入此表。
根據系統中的各種業務邏輯處理,將業務層分為兩大類,一類處理用戶的基本信息,即登錄、注冊、更新個人信息等,另一大類為對用戶郵件的處理,處理郵件的收發等等各項復雜的操作。根據這一思維邏輯,將各項數據庫操作類進行了分類整理,更加有利于代碼的分塊和測試,降低了代碼的耦合,加強了程序的功能模塊化。各操作接口包括:①郵箱用戶信息接口,用于操作James 郵件用戶;②系統用戶基本信息接口,用于操作郵件系統的使用者;③郵件詳情接口,用于獲取郵件信息;④郵件標志接口,用于操作郵件標志;⑤郵件信息接口,用于處理郵件內容;⑥郵件復雜處理接口,如郵件收條、草稿等。
郵件加密解密過程如圖2 所示,用戶將郵件編輯完成,點擊發送按鈕后,后臺獲取郵件信息,使用加密算法進行加密,然后將加密形成的密文存到郵件對象中并發送出去;解密則反過來,將密文使用加密過程中對應的解密算法進行解密,并將明文存入郵件,在添加到郵件集合傳到前臺顯示給用戶,這樣只有在發送給用戶瀏覽器之前才解密,攻擊者即使攻擊了郵件數據庫,獲取了郵件內容,依然無法正常查看郵件。系統提供RSA 和ECC 兩種算法對郵件加密,也可以擴展為其他密碼算法。

圖2 郵件加密及解密過程圖
在系統啟動之初,由管理員選擇一種加密算法,系統啟動成功后,系統會自動加載該配置來初始化系統。具體算法流程如圖3 所示。

圖3 郵件加密算法流程圖
用戶在注冊時,系統自動根據用戶的口令產生大數種子,由此大數種子來產生用戶的公私鑰,將其中的公鑰保存在用戶密鑰信息表中,并將其發布出去,讓所有此系統的用戶知道,私鑰由此用戶私自保有,不為人知。
用戶將郵件編輯完成后,提交到后臺,然后通過業務層中的sendMail 方法獲取前端傳過來的郵件對象,并將除正文以外的信息存在郵件會話中,然后從數據庫中取出用戶的公私鑰(用戶的公私鑰在用戶注冊的時候就已經自動生成),通過公鑰將用戶的郵件正文加密,再將其添加到郵件會話中,然后將郵件發送。
接收郵件時,recipientMail 方法首先獲取James 郵件服務器中的“inbox”,從“inbox”中迭代出全部郵件,然后逐一對郵件正文進行解密。
高效安全的電子郵件系統對于企業的業務開展有很重要的支持作用。為了滿足中小企業對于電子郵件系統的多種需求(配置簡單、價格低廉、安全穩定),基于James 的B/S 結構安全電子郵件系統非常適合中小企業使用。
通過為James 設計相應的Web 系統,使得對于James 的命令行操作轉變為在瀏覽器上的圖形化操作,非常簡單易用。系統采用B/S 設計模式,Server 端主要是負責攔截用戶的請求,并對用戶請求進行解析,作出相應的業務處理和將處理的結果返回給瀏覽器。瀏覽器端主要是向Server 端發送請求和顯示Server 響應的數據。瀏覽器端和服務器端之間交互的數據主要采用的是表單,可以一次性的將大量數據封裝傳輸到服務器端,降低被攔截的風險。
在安全保密方面,使用了密碼算法對郵件進行了加密保護,使得非法用戶即使繞開Web 端入侵了服務器,獲取了服務器上的郵件,也不能正常閱讀,保護了企業秘密不致泄露,對于提高企業信息安全水平有很好的幫助。