◆周明華 楊海云 吳鑫哲 李婉桃
?
國密算法JSSE密碼套件的設計與實現
◆周明華 楊海云 吳鑫哲 李婉桃
(中國民航大學計算機科學與技術學院 天津 300300)
隨著網絡安全對國家安全重大影響,國家密碼管理局發(fā)布了國家商用密碼算法SM系列并制訂了《國密SSL VPN技術規(guī)范》,而目前SSL和TLS協議只支持國際密碼算法實現數據安全傳輸。經研究發(fā)現國密算法的優(yōu)良性能并不遜于DES、RSA等國際密碼算法,甚至性能和密鑰位數更為突出,使用國密算法的網絡安全傳輸協議對我國網絡安全技術實現自主可控具有重要意義。本文通過在OpenJDK添加并注冊國密算法服務提供者,并在JSSE開源提供者中擴展國密標準TLS密碼套件,設計實現基于JSSE框架的國密標準TLS密碼套件。
國密算法;TLS;JSSE;CSP;密碼套件
為保障國家重要領域信息安全,近年來國家有關機構從國家安全和長遠戰(zhàn)略的角度提出了推動國密算法應用實施和加強行業(yè)安全自主可控的要求。建設行業(yè)網絡安全環(huán)境,增強我國行業(yè)信息系統(tǒng)的“安全可控”能力顯得尤為必要和迫切。國家密碼管理局發(fā)布了國家商用密碼算法SM系列并制訂了《國密SSL VPN技術規(guī)范》,國家信息安全制度逐漸被完善。然而,目前在SSL和TLS協議中,還未正式進行對國產密碼算法的擴展。此項工作旨在SSL和TLS協議中,添加國密標準的TLS密碼套件。JSSE為Java版本的SSL和TLS協議提供了框架和實現,我們基于JSSE提出了一種在TLS協議中添加國密標準的TLS密碼套件的設計方案,實現符合國密標準的TLS協議,對國家信息化建設的自主可控具有重要意義。
本文的主要貢獻有三方面:
(1)我們研究了JSSE框架和JCA/JCE的原理,闡述了JSSE和JCA/JCE及其之間的關系。
(2)在OpenJDK中,添加并注冊了名為CAUC_CSTA的國密算法服務提供者,實現了HmacSM3校驗算法和SM4對稱加密算法。
(3)在開源SunJSSE提供者中擴展了國密標準TLS密碼套件TLS_RSA_WITH_SM4_SM3,實現了TLS協議在握手和交互中使用國密算法。
在本文以下的部分,我們首先闡述了JSSE和JCA/JCE及其之間關系以及TLS國密標準,然后提出了JSSE國密算法的設計方案以及方案實施過程,最后對本文進行了總結,并對今后的工作進行了展望。
通過網絡傳輸的數據能會被非預期接收者的人輕松訪問,為了確保信息在網絡傳輸過程中的機密性和完整性,安全套接層(SSL)和傳輸層安全性(TLS)協議旨在保護數據在網絡上傳輸時的機密性和完整性。Java安全套接字擴展(JSSE)為Java版本的SSL和TLS協議提供了框架和實現,并包括數據加密、服務器身份驗證、消息完整性和可選客戶端身份驗證的功能。通過JSSE,開發(fā)人員可以在客戶機和任何運行應用程序協議(如HTTP、Telnet和FTP)的服務器之間通過TCP/IP安全傳輸數據。JSSE使用JCA中定義的相同“提供者”體系結構,使其具有實現獨立性與算法獨立性。OpenJDK默認使用SunJSSE作為JSSE的服務提供者,由JCA/JCE密碼服務提供者(CSP)完成JSSE中的安全加密服務。SunJSSE默認情況下使用SunJCE實現所有的密碼算法,可以通過在安全屬性文件里注冊JCA/JCE的CSP,擴展其他的密碼算法。
國密算法即國家密碼管理局認定的國家商用密碼算法。我國國家密碼管理局近些年陸續(xù)發(fā)布了自主研發(fā)的密碼算法標準。于2010年12月17日發(fā)布的SM3算法,是一種密碼散列函數標準,主要用于數字簽名及驗證、消息認證碼生成及驗證、隨機數生成等,摘要長度為256位。SM4算法,是國家密碼管理局于2012年3月21日發(fā)布的一種分組密碼標準,主要用于數據加密,分組長度,密鑰長度均為128位。
國家密碼局在TLSv1.1的版本基礎上,針對國內現狀,發(fā)布了《國密SSL VPN技術規(guī)范》,此標準基于國密SSL的技術協議,對產品功能、性能和管理作出了相關規(guī)定,并定義了一系列國密套件。在此項工作中我們選中TLS_RSA_WITH_SM4_SM3國密標準密碼套件完成設計與實現。
JSSE和JCA/JCE的框架中是由實現JCA/JCE的CSP提供JSSE中的安全加密服務的,然而在JSSE中并不支持國密標準TLS協議的密碼算法套件,為了使JSSE支持國密標準的TLS協議,我們設計了一種在不改變JSSE框架的條件下實現國密標準TLS協議的密碼算法套件方案。方案步驟如下,流程圖見圖1。
圖1 設計方案流程圖
步驟1:基于JCA/JCE的“提供者”架構,建立支持國密算法的CSP,命名為CAUC_CSTA。繼承服務提供者接口(SPI)實現HmacSM3校驗算法和SM4對稱加密算法,并將它們注冊為CSP的HmacSM3和SM4算法的實現類。
步驟2:在OpenJDK中通過“%JAVA_HOME%jrelibsecurityjava.security”文件靜態(tài)注冊密碼服務提供者CAUC_CSTA。
步驟3:在開源JSSE服務提供者SunJSSE中修改其代碼,添加國密標準的TLS密碼套件別名TLS_RSA_WITH_SM4_SM3,建立國密標準的TLS密碼套件TLS_RSA_WITH_SM4_SM3與CSP實現的密碼算法HmacSM3和SM4之間的關系。
(1)JCA/JCE簡介:JCA/JCE是Java平臺提供的安全加密服務框架。它們不實現密碼算法,只定義了一組加密服務接口。而加密算法的實現是基于“提供者”架構創(chuàng)建相應的CSP,繼承SPI實現相應算法的實現類,并建立CSP所定義的密碼算法與實現類之間的關系。
(2)SM4算法實現:為了在數據傳輸時能夠使用SM4作為數據加密算法,我們通過繼承javax.crypto.CipherSpi類來編寫SM4類,其需要實現的SPI方法有engineSetMode、engineSetPadding、engineInit,engineDoFinal等,在這些方法里面實現初始化和完整的加密、解密算法。
(3)HmacSM3算法實現:為了使用HmacSM3作為數據驗證算法,我們通過繼承javax.crypto.MacSpi來編寫HmacSM3類,其需要實現的SPI方法有engineInit、engineUpdate、engineDoFinal等,在這些方法里實現哈希算法的初始化和哈希值的更新和計算。
(4)CSP創(chuàng)建:通過繼承javax.crypto.Provider類來創(chuàng)建CSP,需要設置名稱和版本號等基本信息,為相關算法指定具體實現的類,如put(“Cipher.SM4”, “org.me.provider.SM4”),這樣就完成了SM4加密算法的實現指定,當用戶調用如Cipher.getinstance(“SM4”)時,就能得到相應實例。我們可以將CSP生成一個jar包以方便使用。當用戶將該CSP加入到Java環(huán)境中時,就能夠調用到相應算法。
(5)CSP注冊:我們通過靜態(tài)注冊的方式安裝CSP,通過配置JRE,修改%JDK_Home%jrelibsecurityjava.security文件,新增一行org.me.provider.CaucCstaProvider,之后導入CSP的jar包到Java環(huán)境中,將其放入%JRE_Home%libext目錄中。
3.3.1 國密標準密碼套件擴展
通過實現對JSSE框架及其提供者SunJSSE的研究,SSLSocketImpl類依賴SSLSessionImpl類,SSLSessionImpl類依賴CipherSuite類預定義TLS協議所用的校驗算法、加密算法,并調用CipherSuite類的靜態(tài)方法add預定義所有密碼套件CipherSuite類對象集合。
添加國密標準TLS密碼套件TLS_RSA_WITH_SM4_SM3方式是在sun.security.ssl.CipherSuite類進行預定義密碼套件的靜態(tài)代碼塊中添加代碼:
add("TLS_RSA_WITH_SM4_SM3", 0xe01a, --p, K_RSA, B_SM4, N)。
通過以上代碼會創(chuàng)建該密碼套件對象并將其添加進CipherSuite類對象集合中。在創(chuàng)建過程中,需要擴展HmacSM3和SM4算法,擴展方式見3.3.2和3.3.3。
3.3.2 HmacSM3算法擴展
在CipherCuite類中,校驗算法是通過相應的校驗算法名作為靜態(tài)常量CipherSuite$MacAlg類對象名稱預定義每一種校驗算法;通過CipherSuite$MacAlg類的macAlg對象確定在數據傳輸過程中所用的校驗算法;通過CipherSuite$MacAlg類的newMac工廠方法創(chuàng)建使用時sun.security.ssl.MAC類對象。
MAC類對象包含javax.crypto.Mac引擎類對象屬性,是由sun.security.ssl.JSSEJce類的getMac靜態(tài)方法創(chuàng)建,是真正用來做校驗算法的引擎類。Mac類歸屬于JCA/JCE,正是通過這種方式JSSE調用了JCA/JCE中的數據校驗服務,我們通過創(chuàng)建JCA/JCE含有HmacSM3算法的CSP和修改JSSE代碼實現了在JSSE中使用HmacSM3算法作為TLS協議中的校驗算法,含HmacSM3算法的CSP創(chuàng)建已在3.2說明。JSSE的修改步驟如下:
步驟1:在CipherSuite類中預定義MacAlg類名為M_SM3的靜態(tài)常量,相應位置添加代碼:
final static MacAlg M_SM3 = new MacAlg("SM3",32,64,9)
步驟2:對CipherSuite類的構造函數中添加對HmacSM3校驗算法的判別,使其在創(chuàng)建含HmacSM3算法的密碼套件時將M_SM3對象引用給macAlg對象,進而作為數據傳輸過程中的校驗算法,相應位置添加代碼:
if (name.endsWith("_SM3")) { macAlg = M_SM3;}
步驟3:對MAC類的構造函數中添加對HmacSM3校驗算法的判別,使在JSSEJce類通過getMac靜態(tài)方法創(chuàng)建Mac引擎類對象時成功實例化HmacSM3算法,在相應位置添加代碼:
if (macAlg == M_SM3) {algorithm = "HmacSM3";}
3.3.3 SM4算法擴展
在CipherCuite類中,對稱加密算法是通過相應的加密算法名作為靜態(tài)常量CipherSuite$BulkCipher類對象名稱預定義每一種加密算法;通過CipherSuite$BulkCipher類的cipher對象確定在數據傳輸過程所用的對稱加密算法;通過CipherSuite$BulkCipher類的newCipher工廠方法創(chuàng)建使用時sun.security.ssl.CipherBox類對象。newCipher方法是通過調用CipherBox類的newCipherBox靜態(tài)工廠方法創(chuàng)建CipherBox類對象。
CipherBox類對象包含javax.crypto.Cipher引擎類對象屬性,其是由JsseJce的getCipher靜態(tài)方法創(chuàng)建,是真正用來做加密算法的引擎類。Cipher類歸屬于JCA/JCE,正是通過這種方式JSSE調用了JCA/JCE中的對稱加密服務,我們通過創(chuàng)建JCA/JCE含有SM4算法的CSP和修改JSSE代碼實現了在JSSE中使用SM4算法作為TLS中的對稱加密算法,含SM4算法的CSP創(chuàng)建已在3.2說明。
JSSE的修改方式是在CipherSuite中預定義BulkCipher類對象名為B_SM4的靜態(tài)常量,在相應位置添加代碼:
final static BulkCipher B_SM4 = new BulkCipher(CIPHER_SM4,BLOCK_CIPHER, 16, 16, 0, true);
從而在創(chuàng)建與之對應的密碼套件時將定義數據傳輸過程中的cipher對象被引用為B_SM4對象。
3.3.4 密碼套件測試
我們創(chuàng)建基于TLS的安全服務器和安全客戶端,分別使用SSLServerSocket和SSLSocket類來創(chuàng)建安全套接字進行通訊,通過指定TLS_RSA_WITH_SM4_SM3密碼套件來進行Echo協議測試,使用Java提供的keytool工具生成所需的RSA證書,并在TLS握手事件完成后輸出套接字所使用的密碼套件。由調試數據圖4可見服務器和客戶端通訊過程中所使用的密碼套件為TLS_RSA_WITH_SM4_SM3,由圖2客戶端與圖3服務端可見,TLS握手順利完成。與我們預想的一致,能夠正確完成整個數據交互過程。
本文筆者提出了一種使JSSE支持國密標準的TLS協議密碼套件的設計方案,此方案在不改變JSSE框架的條件下,通過對開源的SunJSSE進行了密碼套件擴展以及注冊實現國密算法的CSP,成功實現了JSSE對國密標準TLS協議的密碼算法套件的支持。在未來,我們將加入SM2非對稱加密算法,創(chuàng)建獨立的JSSE服務提供者,它將支持國密證書的制作與解析,實現更多的國密標準TLS協議的密碼算法套件。
圖2 客戶端
圖3 服務端
圖4 調試數據
[1][英] Ivan Ristic.HTTPS權威指南[M].北京:人民郵電出版社,2016.
[2]劉平等.SSL VPN 技術規(guī)范[M].北京:中國標準出版社,2014.
[3]吳永強.國密SSL安全協議通信協議的研究與實現[D].西安:西安電子科技大學,2014.
[4]羅鈺.深入淺出Linux TCP/IP協議棧[M].北京:人民郵電出版社,2010.
[5]賈猛等.支持國密算法的安全套接層協議擴展方法: 中國,104394179[P/OL].2014-12-18.
大學生創(chuàng)新創(chuàng)業(yè)訓練項目(項目編號:IECAUC2018013)。