◆智 勇
(方正寬帶網絡服務有限公司 北京 100011)
隨著企業信息化的發展與應用,管理信息系統在企業經營管理活動中扮演著重要的角色,多數企業單位建立了局域網(Intranet)和廣域網(Internet)管理信息系統[1]。在技術層面,基于瀏覽器/客戶端(Browser/Server,簡稱B/S結構)的系統架構是當前實現企業管理信息系統的主流框架。在這種模型下,用戶工作界面是通過瀏覽器來實現的,能實現不同的人員,在不同的地點,以不同的接入方式(比如LAN,WAN,Internet/Intranet等)訪問和操作共同的數據。該結構在TCP/IP的支持下,以HTTP為傳輸協議,客戶端通過Browser訪問Web服務器以及與之相連的后臺數據庫的技術及體系結構[2]。
在一個標準的客戶端/服務器模型中,瀏覽器的主要功能就是向服務器發出請求,并在瀏覽器窗口中展示用戶期望的數據資源。Web服務器的主要作用就是接收用戶請求,并計算、檢索數據資源,再通過網絡鏈路將數據結果發送給客戶端。這是一個標準的客戶端/服務器模型,其中的傳輸協議便是HTTP。但在數據傳輸過程中,瀏覽器與 Web服務器之間的數據傳輸是明文的,HTTP協議是無狀態的,通信安全性比較差。針對企業系統管理的實際情況而言,Web服務器一般集中部署于企業內網或者是安全管理域中,有明確的管理方法與制度。而客戶端的瀏覽器實際處于一種“自由”使用的狀態。一般情況下,服務器無法確認和確信客戶端程序的身份,系統無法保證通信數據的完整性、可靠性和機密性。因此,如何防止信息被篡改、偽造、假冒和監聽,以達到B/S結構管理系統安全通信的目的是十分值得關注的。
從方法論的角度來講,針對B/S結構的企業管理系統在數據通信中存在潛在的安全問題。數據加密技術是保障網絡系統信息數據安全的基本方法,它一般是在密碼學的基礎上,對數據傳輸中的明顯信息以函數加密或者密鑰加密等方式進行加密處理,使該部分信息數據只能被特定人群破解和使用[3]。在當今主流的應用加密技術中,大體上可分為對稱式加密和非對稱式加密技術兩類,在B/S結構程序的數據通信場景中各自有其自身的優勢與不足。
加密的本質就是將人或者系統能理解的信息(明文)與一串數字(密鑰)相結合,生成不可理解的數據(密文)的過程。解密是加密運算的逆變換,是通過密鑰將密文再還原為明文的過程。回顧密碼學發展的歷程,對稱加密技術是被最早研究并且應用于數據安全領域的技術之一,比較經典的有 DES、3DES、IDEA、RC5以及AES等算法。其主要特點就是加密與解密過程使用同一套密鑰,依靠算法自身的邏輯策略逐步提升數據安全性,安全指標主要包括密鑰長度、運算速度、破解時間等幾個方面的綜合影響。從早期的DES到目前主流使用的AES算法,從理論到應用均已經發展得非常成熟。尤其是 AES(Advanced Encryption Standard)算法,是目前最安全的加密算法,密鑰長度有128、192、256位可選,其優勢是運算速度快,并且至今還沒有被破解過,因此被業界廣泛使用。但對于B/S結構的系統應用場景而言,如果瀏覽器和 Web服務器想使用相同的密鑰,如何做到在數據通信前,密鑰分發的過程保密;如何保障已經分發至瀏覽器與Web服務器端的密鑰安全存放而不被竊取,這是對稱加密技術應用于B/S結構數據通信首先要解決的問題。
不同于對稱加密技術,非對稱加密技術使用兩個密鑰:公開密鑰(簡稱:公鑰)和私有密鑰(簡稱:私鑰),并且公鑰與私鑰是配對使用。用公鑰加密的數據只有配對的私鑰才能解密,相應地用私鑰加密的數據也只能由配對的公鑰才能解密。最著名的非對稱加密算法要屬RSA算法,這是一種高強度的非對稱加密技術,密鑰長度少則512位,多則2048位,非常難破解,至今尚未有人能破解密鑰長度超過1024位以上的RSA加密數據,可以說非常安全,并且在當今電子商務領域有著廣泛地使用。鑒于RSA算法中密鑰的非對稱性,可應用于B/S結構的數據通信以及密鑰分發過程。可以說,某種程度上非對稱加密算法也是一種密鑰的保密方法,但由于是采用非對稱加密,加、解密耗費時間很長,是DES加密時間的1000倍以上。因此在B/S結構的系統中,如果直接將 RSA算法應用于數據通信,當遇到查詢大量數據,批量上傳數據或者長表單數據提交的場景中,瀏覽器與 Web服務器的響應時間會顯著增長,影響交互的效果與業務的執行。
除了需要考慮對數據進行加密外,如何保證數據傳輸過程中的完整性、發送者的身份認證、防止數據發生篡改同樣是在B/S結構系統數據通信中需要考慮的問題。數字簽名技術是解決這類問題的有效手段。在非對稱加密的體制中,發送方用一個哈希函數從原始數據中生成數字摘要,并用自己的私鑰對這個摘要進行加密,這個加密后的摘要將作為原始數據的數字簽名和原始數據一起發送給接收方,接收方首先用與發送方一樣的哈希函數從接收到的數據中計算出報文摘要,接著再用發送方的公鑰來對數據附加的數字簽名進行解密,如果這兩個摘要相同、那么接收方就能確認該數字簽名是發送方的。哈希函數不同于加密,其過程是不可逆的,無法通過數字摘要再反算出原數據。在B/S結構的數據通信過程中,主要是依靠這種手段來保證數據的完整性。
通過上述分析,在保障信息安全各種功能特性的諸多技術中,密碼技術是信息安全的核心和關鍵技術,通過數據加密技術,可以在一定程度上提高數據傳輸的安全性,保證傳輸數據的完整性[4]。當然,在不同的應用場景、網絡結構對安全性的需求各有不同,通過對主流的數據加密技術進行考察,并結合B/S結構系統在通信技術、系統部署以及管理的實際情況,本文設計并實現了一種基于RSA非對稱加密與AES對稱加密相結合的數據通信加密方案。
目前密碼系統大多采用混合密碼體系,即用公鑰密碼體制實現密碼管理和數字簽名,用傳統密碼體制實現大量信息的加解密。這樣既增強了密碼系統的安全性,又可以比較快速地進行加解密[5]。這里所說的傳統密碼體制就是對稱加密技術。考慮B/S數據通信場景,系統的拓撲結構是分布式的,物理設備是分散的,數據通信基于請求-響應機制。除此之外,盡管HTTP協議是無狀態的,但可以利用Web服務器的Session(會話)技術,保存瀏覽器與Web服務器會話狀態與數據。針對這樣的特點,混合加密的整體思路是用RSA算法分發密鑰,保障AES密鑰安全傳輸并實現數字簽名,再用AES算法加密數據,提高計算效率;整個密鑰生成的過程是動態的、基于Session回話的。整體模型與具體步驟如圖1所示。

圖1 混合加密的密鑰生成與傳輸
第一階段,在瀏覽器與Web服務器建立會話的初期,用RSA算法動態生成私鑰、公鑰對,并相互交換公鑰。當瀏覽器向第一次訪問Web服務器地址時,Web服務器端程序為該客戶端請求創建會話變量并保存至Session中,同時生成服務器端的會話私鑰Sks與公鑰Sps,私鑰Sks保存在Session中,公鑰Sps返回給請求客戶端。客戶端確認接收Web服務器返回的會話公鑰Sps,同樣生成客戶端瀏覽器的會話私鑰Cks與公鑰Cps,并用服務器會話公鑰Sps加密客戶端會話公鑰Cps發送給Web服務器,Web服務器接收瀏覽器數據,用Session中的會話私鑰Sks解密數據,取得客戶端的會話公鑰Cps并保存至 Session,整個會話公鑰交換過程完成。瀏覽器與Web服務器建立了Session會話,各自持有自身動態生成的私鑰,相互交換的會話公鑰。
第二階段,在Web服務器端動態生成AES會話密鑰Rs,并用客戶端公鑰Cps對Rs進行加密生成Rs’,將Rs’返回至客戶端瀏覽器,瀏覽器用客戶端會話私鑰Cks對Rs’進行解密得到AES會話密鑰。瀏覽器與Web服務器通過公鑰加密并驗證了AES密鑰傳遞過程。第二階段完成后,Web服務器與客戶端瀏覽器持有相同的對稱AES密鑰。
第三階段,數據通信階段,無論瀏覽器向Web服務器發送請求,還是 Web服務器向瀏覽器返回應答數據,都通過會話密鑰Rs對業務數據D進行加、解密操作,并通過公鑰體制進行簽名驗證。數據簽名與驗證過程如圖2所示,簽名過程是用MD5算法對業務數據D生成數字摘要d,在Web服務器端用會話私鑰Sks對摘要d進行加密,并附加于數據D尾部再用AES算法加密形成加密數據 D’返回至瀏覽器端。瀏覽器端的簽名驗證過程如下,用AES密鑰解密數據D’取得加密摘要并用服務器會話公鑰Sps解密得到原始摘要。最后,在瀏覽器端用相同的MD5算法計算數據D的數字摘要與原始摘要對比,從而完成數據一致性校驗過程。服務器端的簽名驗證過程相似,不同的是簽名時使用的是瀏覽器端的會話私鑰Cks,而驗證過程使用 Session中保存的瀏覽器會話公鑰Cps。

圖2 數據簽名與驗證過程
該模型基于B/S系統應用場景,綜合了AES加解密速度快,RSA非對稱密鑰機制便于密鑰分發的優勢,具有以下一些優勢:
(1)利用Web服務器Session會話機制,私鑰、公鑰以及AES密鑰均動態生成,無須預先設置以及持久化存儲,隨著一次會話過程的結束,密鑰會自動銷毀。例如,用戶關閉瀏覽器或者服務器端閑置時長超過Session設置的最大時長則私鑰、公鑰變量自行銷毀。
(2)瀏覽器與Web服務器均生成各自的私鑰、公鑰,并相互交換,不同會話進程中的AES密鑰、RSA公、私鑰均不相同,并與數字簽名結合使用,這種雙向交叉驗證的策略進一步能降低在公鑰交換過程中,被不合法截取與濫用的風險,從而提升系統的安全性。
(3)盡管https和數字簽名技術是目前登錄方案中常用的技術,但其在應用的過程中會涉及證書及公證中心,對企業內部管理系統來說成本過大[6]。不同于數字證書技術,該方法的實現基于代碼級別,在服務器端與客戶端程序中封裝為工具類、函數,實現簡單且便于復用。
(4)RSA、AES算法以及數字簽名技術是業界成熟與通用的算法體系,是經過縝密研究與實踐檢驗的方法體系。從通信安全的角度來講,RSA更適合密鑰分發,因為AES加、解密的效率高。
上述混合數據加密模型在本企業內部人事管理系統中得以實現與應用。系統基于B/S結構,前、后端分離的方式實現。后端程序基于JDK1.7版本,使用Apache Tomcat Web服務器,程序開發使用 Spring Boot框架,通過注解方式簡化組件配置,提升開發效率。前端頁面全部使用Html5實現,通過JQuery的AJAX調用封裝的方法,向后端 Web服務器程序發送請求并接收應答數據。核心邏輯涉及 Web服務器后端數據的加解密以及瀏覽器前端數據的加解密封裝。
2.3.1 Web服務器后端數據加解密
Web服務器后端數據加、解密關鍵模塊如圖3所示。
SecUtils安全模塊封裝了常用的RSA、AES、MD5等加密、解密以及哈希算法工具包。主要功能包括MD5數據摘要生成,RSA公鑰加密,RSA私鑰解密,數字簽名與簽名校驗;AES密鑰生成,AES數據加密,AES數據解密。
WebFilter類是后端系統的自定義過濾器,該模塊位于 Web容器的最前端,除SecController模塊之外,所有瀏覽器請求數據、業務模塊返回數據都要經過該模塊的解密與加密處理。基本流程如下,當過濾器接收到瀏覽器提交的加密數據后,先用 AES密鑰解密并執行簽名驗證,數據解密后再分發至相應控制器模塊執行處理。同理,當控制器返回應答數據時,也需要經過過濾器對數據進行客戶端會話公鑰簽名、AES加密處理后再發送至客戶端瀏覽器。這樣無須在各控制器模塊對數據做轉換,實現了在Web服務器端對收、發數據的統一的處理。

圖3 Web服務器后端加、解密程序模塊
SecController控制器類主要任務是負責創建 Web服務器與瀏覽器 RSA會話密鑰對,執行 AES密鑰交換。其中,getServerPublicKey方法創建Web服務器端RSA會話公鑰、私鑰對,保存RSA私鑰至Session中,并將RSA公鑰返回至客戶端瀏覽器;putClientPublicKey方法接收客戶端RSA公鑰,動態生成AES密鑰,在保存至Session變量同時,通過客戶端RSA公鑰加密AES密鑰返回至客戶端瀏覽器。
2.3.2 瀏覽器前端數據加解密
瀏覽器前端程序同樣需要實現對發送與接收數據的加、解密操作。在前、后端分離模式的程序中,前端數據的發送與接收是通過JQuery的AJAX方法實現的。為簡化每個交互頁面中的數據加、解密操作,程序對AJAX原生方法又進行了一次封裝,代碼封裝在request-common.js文件中。前端程序向后端Web服務器發送請求時,引用request-common.js文件,調用Request.Update方法,在Request.Update方法中的data參數統一對發送數據進行客戶端加密、簽名操作,對服務器成功返回數據進行統一解密和簽名驗證操作。
與后臺程序結構類似,前端程序同樣需要實現加、解密算法庫管理、進行客戶端公鑰、私鑰初始化以及與Web服務器公鑰交換操作。如圖4所示,secutil目錄包含了加、解密相關的全部js算法文件,secinit.js文件實現了發起會話請求,接收服務器公鑰,生成客戶端公鑰、私鑰,發送客戶端公鑰以及接收并保存AES密鑰的功能。

圖4 瀏覽器前端加、解密程序模塊
本文重點介紹了在B/S結構的管理系統在瀏覽器與Web服務器數據通信場景中,主流的加密與數字簽名各自的特點與不足。通過綜合分析,提出了一種結合對稱加密、非對稱加密以及數字簽名技術的混合加密方案,并在本企業內的人事管理信息系統中得以實現與應用。實踐證明,該方法具有一定的通用性,適用于大多數中、小企業B/S結構的管理信息系統中前后端的通信數據安全。除此之外,該方法也具有一定的擴展性,可通過結合單點登錄機制以及內存數據庫redis的session共享方案擴展到多應用系統,進一步可以通過統一安全網關接口程序對WebFilter封裝,從SOA(面向服務的架構)的角度為多個系統應用提供數據加、密服務。