孫炳潤 馬剛
摘? 要:隨著信息技術的飛速發展,Socket的數據傳輸安全技術成為近幾年的熱點研究問題,為了實現網絡數據傳輸安全技術的功能,必須充分利用Socket通信的自身優勢,并結合Java語言的安全性特點來完成。本文分析了Java平臺下Socket數據傳輸安全的特點,研究了三種基于Socket數據傳輸安全技術。希望給后續研究提供一定的參考
關鍵詞:JAVA;傳輸安全;對象序列化;數字簽名;SSL
一、JAVASOCKET網絡通信編程的實現過程
1.1建立服務器端
(1)調用ServerSocket類,以某個端口號為參數創建一個ServerSocket實例,即是服務器端的服務程序在監聽該指定端口的Socket。
(2)創建ServerSocket并保持監聽狀態,調用了ServerSocket對象的accept()方法,隨后接收來自客戶發送的Socket連接請求。在服務器程序監聽Socket連接請求時,也可采用Java的多線程技術,實現并發服務器連續監聽連接請求。
(3)調用Socket對象的getInputStream和getOutputStream方法建立輸入流和輸出流,并進行封裝。不過在調用這兩個方法時可能會產生I/O異常,必須要去捕獲這個I/O異常。
(4)使用建立好的輸入輸出流對象的read和write方法完成和客戶端的數據傳輸,并把處理結果返回給客戶端。
(5)在服務器與客戶機雙方通訊結束以后,服務器端應該及時關閉輸入和輸出這兩個數據流。
1.2建立客戶端
(1)以服務器指定的IP地址或主機名以及服務器指定的端口號為參數,調用Socket類的構造方法,創建一個Socket對象。
(2)建立了客戶端通信的Socket后,就可以像服務器一樣使用Socket的getInputStream和getOutputStream方法來創建輸入流和輸出流。
(3)調用輸入流和輸出流對象相應的方法讀寫字節流或字符流數據,完成雙方的通信任務。
(4)在客戶機與服務器雙方通訊結束以后,我們也要用字節流或字符流對象的close()方法來關閉用于網絡通信的輸入流和輸出流,再用Socket對象的close()方法來關閉Socket。
二、基于SOCKET數據傳輸的安全技術分析
2.1基于Socket的對象序列化的安全技術分析
(1)對象序列化的安全技術分析
對象一旦被序列化后,作為對象序列化結果的字節流可以讀取,也可以被任何能訪問該流的對象改變,這就允許任何對象訪問序列化對象的狀態,因而違背了用戶所期望的隱私權。同時,用戶也可以任何方式改變流中的字節,并允許重新構造Java平臺下保護范圍內從未創建的對象。
2.2基于SOCKET的數字簽名的安全技術分析
數字簽名的技術主要有DSA和RSA算法兩種,而DSA比RSA產生密鑰速度快,但它們的安全性差不多。其主要包括三個過程:一是生成公鑰和私鑰,其中公鑰可以對外公開,私鑰用于加密;二是簽名文件內容,即將生成的密鑰對寫入或保存到文件中;三是發送簽名后的數據及公鑰,拿公鑰來檢驗數據文件中的數字簽名。
2.3基于SOCKET的SSL的安全技術分析
(1)安全套接層協議
a.客戶端向服務器端發起通信對話,協商傳送加密算法,準備進行安全的對話,并告之所用的對稱加密算法、密鑰交換算法、摘要算法等。
b.服務器收到請求后向客戶端發送服務器數字證書,并確定使用一種加密組合進行通信,為了證明確實是服務器端,必須發送服務器端的數字證書給客戶端,并且讓客戶端驗證服務器端的身份。
c.客戶端再向服務器端傳送本次對話的密鑰,檢查服務器端的數字證書是否正確,通過證書驗證了服務器端證書的真實有效性后,利用服務器端的公鑰生成本次對話的密鑰發送給服務器端,并告之服務器端。
d.服務器端向客戶端獲取密鑰,并用自己的私鑰解密獲取本次通訊的密鑰,并告之客戶端已經獲取了密鑰可以開始通信了。
e.服務器端與客戶端進行通訊。
(2)安全套接層協議
一般的SSL套接字有許多默認選項,如果想修改其中的某些選項,就要用到SSLContext類的對象來實現。
三、基于Socket數據傳輸安全方案的研究
3.1基于Socket的對象序列化安全方案
(1)將要保密的數據標記為transient屬性
如將某一對象中password字段保護起來,可以對該字段屬性設置為PrivatetransientStringpassword;當對象在序列化發生時,Java虛擬機將被聲明為transient的所有域。
(2)實現Externalizable接口
Externalizable接口屬于Serializable接口的子類。但是如果采用這種Externalizable接口的方法,必須就要聲明writeExternal()和readExternal()兩個函數。將不需要被序列化的字段提取出來放到父類中去,讓子類實現Serializable接口,這樣的話父類相應的字段數據就可以不被序列化。
3.2基于Socket的數字簽名安全方案
(1)開發簽名的數據對象
首先需要有一個待簽名的對象,而這個對象在進行序列化時,對象中只出現公鑰。
(2)開發客戶端
客戶端需要實現讀取文件內容,使用安全API接口來產生一對密鑰(包含公有和私有)、簽名文件內容,并且通過網絡來發送加密后的對象給服務器,相關類和方法及步驟如下:
a.使用KeyPairGenerator類來產生公共及私有密鑰。
b.使用KeyPairGenerator類的initialize()方法來完成初始化密鑰對。
c.獲得密鑰。
d.獲取一個簽名的對象。e.初始化簽名對象。
e.把需要簽名的數據提供給簽名對象,將需要簽名的數據讀到一個字節數組,然后再通過調用Signature類的update方法,再把數組提供給簽名對象。
f.產生簽名,然后通過網絡發送。
(3)開發服務器端
a.創建Signature類的一個實例。
b.用公有密鑰初始化對象。
c.使用update()方法提供簽名的數據來給需要驗證的簽名。
3.3基于Socket的SSL安全方案
SSL協議可分為兩層:第一層是SSL記錄協議,它是建立在可靠的傳輸層協議之上,為應用層協議提供數據壓縮、封裝、加密等基本功能;第二層是SSL握手協議,它是建立在SSL記錄協議之上,用在數據傳輸開始前,通信雙方身份認證、交換加密密鑰、協商加密算法等初始化協商功能。基于Socket的采用SSL協議的傳輸安全方案需要用到一個Java數據證書的管理工具Keytool。Keytool將密鑰(key)和證書(certificates)保存在一個稱為keystore的文件當中,每個keystore都關聯著這一個獨一無二的公鑰。
四、結束語
網絡數據傳輸安全已成為網絡應用發展的一個瓶頸。本文分析研究了網絡數據基于JavaSocket的傳輸安全問題,對基于JavaSocket的網絡數據傳輸安全的三種技術進行了深入研究和探討,提出了三種基于JavaSocket網絡數據傳輸的安全的技術方案。
參考文獻
[1]? 耿祥義.Java2實用教程[M].北京:清華大學出版社,2013.
[2]? 王一飛.Java網絡程序設計[M].北京:中國電力出版社,2010.
[3]? 姚凱,劉琳琳.基于Java多線程技術的網絡編程研究[J].電子技術與軟件工程,2017,8:12