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