常衛(wèi), 浮明軍, 徐亞超, 黃顯果, 劉靜靜
(1.許繼電氣股份有限公司,河南,許昌 461000; 2.許繼電源有限公司,河南,許昌 461000)
隨著電力行業(yè)安全性標(biāo)準(zhǔn)的提高,基于GMSSL庫(kù)的應(yīng)用已經(jīng)成為基礎(chǔ)設(shè)施的一部分。SSL/TLS協(xié)議可以有效保證通信[1]的機(jī)密性。鑒于SSL/TLS安全協(xié)議的通信重要性及廣泛性,針對(duì)TLS協(xié)議實(shí)現(xiàn)及國(guó)密算法的安全審查漏洞檢測(cè)及應(yīng)用研究已成為了熱點(diǎn)。目前研究的已知漏洞,包括BEAST攻擊、BREACH攻擊、CRIME攻擊等,相關(guān)研究發(fā)現(xiàn)開(kāi)源工具testssl.sh能夠檢測(cè)出這些漏洞[2-3];基于圖像密文重構(gòu)與卷積神經(jīng)網(wǎng)絡(luò)[4-5]等手段的分析方法,對(duì)主流密碼算法的密文隨機(jī)性進(jìn)行了分析,這也為T(mén)LS密碼套件選擇與加密流量的深層分析提供了參考;對(duì)SM2加密算法的核心加密流程[6]進(jìn)行優(yōu)化,在不影響算法安全性的前提下,提出基于優(yōu)化的SM2國(guó)密算法替換ECDSA公鑰簽名算法的區(qū)塊鏈設(shè)計(jì);區(qū)塊鏈技術(shù)結(jié)合簽名密鑰算法[7]提高電子存證數(shù)據(jù)的安全性。以上都是對(duì)TLS協(xié)議實(shí)現(xiàn)庫(kù)存在的安全漏洞、國(guó)密算法優(yōu)化等方面進(jìn)行的相關(guān)研究,但GMSSL庫(kù)中的接口實(shí)現(xiàn)只是對(duì)核心功能進(jìn)行了設(shè)計(jì),目前業(yè)界對(duì)公用接口的封裝使用漏洞缺乏相關(guān)研究分析,因此本文的研究很有必要性。
TLS(安全傳輸層),TLS[8-10]是建立在傳輸層TCP協(xié)議之上的協(xié)議,服務(wù)于應(yīng)用層,它的前身是SSL(安全套接字層),實(shí)現(xiàn)了將應(yīng)用層的報(bào)文進(jìn)行加密后再交由TCP進(jìn)行傳輸?shù)墓δ堋?/p>
圖1 TLS通信層
TLS通信機(jī)制可以分為兩步[11]:服務(wù)器端和客戶端進(jìn)行“握手”,身份驗(yàn)證通過(guò)后分別生成對(duì)稱密鑰;客戶端使用對(duì)稱密鑰加密,服務(wù)端使用對(duì)稱密鑰解密,雙方通過(guò)“對(duì)稱密鑰”進(jìn)行加密通信。可以細(xì)分為四步:
1) 客戶端向服務(wù)器發(fā)送TLS協(xié)議的版本號(hào)、一個(gè)隨機(jī)數(shù)A、以及所支持的加密算法(如RSA)。
2) 服務(wù)器確認(rèn)是否支持客戶端發(fā)送的TLS協(xié)議版本,同時(shí)給出數(shù)字證書(shū)(包含服務(wù)器的公鑰)以及一個(gè)隨機(jī)數(shù)B。
3) 客戶端驗(yàn)證數(shù)字證書(shū)有效后,生成一個(gè)新隨機(jī)數(shù)C,并且使用證書(shū)中的公鑰加密此隨機(jī)數(shù),最后將加密后的隨機(jī)數(shù)發(fā)送到服務(wù)器。
4) 服務(wù)器使用自己的私鑰解密被加密后的隨機(jī)數(shù)C,使用加密算法對(duì)隨機(jī)數(shù)A、B、C進(jìn)行加密,生成對(duì)稱密鑰??蛻舳耸褂猛瑯拥募用芩惴ㄉ膳c服務(wù)器相同的對(duì)稱密鑰。
SSL/TLS協(xié)議本身的復(fù)雜性為應(yīng)用者增加了負(fù)擔(dān),為了減輕開(kāi)發(fā)者的負(fù)擔(dān)及防范由代碼缺陷導(dǎo)致的安全風(fēng)險(xiǎn),SSL/TLS協(xié)議實(shí)現(xiàn)細(xì)節(jié)通常被封裝在OpenSSL,NSS等開(kāi)源軟件庫(kù)中。而國(guó)密算法[12-13]是國(guó)家密碼局制定標(biāo)準(zhǔn)的一系列算法,其中包括SM2橢圓曲線非對(duì)稱加密算法、SM3雜湊算法、SM4[14-15]對(duì)稱加密算法。
GMSSL是支持國(guó)密算法和標(biāo)準(zhǔn)的OpenSSL分支,增加了對(duì)國(guó)密SM2/SM3/SM4算法和ECIES、CPK、ZUC算法的支持。GMSSL庫(kù)對(duì)TLS協(xié)議通信、國(guó)密算法的核心功能進(jìn)行了封裝,應(yīng)用者只需要調(diào)用提供的接口即可實(shí)現(xiàn)所需的功能。本文首先介紹了TLS通信機(jī)制及被測(cè)軟件功能,重點(diǎn)闡述了基于被測(cè)軟件設(shè)計(jì)的軟件測(cè)試框架,最后對(duì)GMSSL庫(kù)提供的SM2、SM3、SM4國(guó)密算法及常規(guī)的數(shù)字證書(shū)操作接口、TLS通信接口進(jìn)行的二次封裝軟件進(jìn)行了測(cè)試,發(fā)現(xiàn)對(duì)GMSSL庫(kù)函數(shù)的調(diào)用漏洞,將會(huì)導(dǎo)致TLS通信初始化錯(cuò)誤、加解密錯(cuò)誤等問(wèn)題。本文的研究對(duì)于正確實(shí)現(xiàn)TLS加密通信具有重要的參考意義。
二次封裝完畢后,需要確認(rèn)功能、性能、效率及內(nèi)存等是否滿足要求。此時(shí),測(cè)試就是重要的保障環(huán)節(jié)。功能測(cè)試用于確保接口實(shí)現(xiàn)的全面性及功能正確性;性能測(cè)試用于考核加解密速度能力;內(nèi)存測(cè)試主要考核最大資源消耗情況。應(yīng)設(shè)計(jì)測(cè)試驅(qū)動(dòng)測(cè)試上述項(xiàng)目符合相關(guān)標(biāo)準(zhǔn)或要求。
測(cè)試環(huán)境搭建要從靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試兩方面考慮。靜態(tài)測(cè)試主要通過(guò)checkmarx、CoBot和fortify、polyspace等工具按照源代碼編譯環(huán)境、工具配置要求及選擇編碼規(guī)則對(duì)靜態(tài)測(cè)試環(huán)境進(jìn)行搭建。測(cè)試工具通過(guò)掃描源代碼分析程序的系統(tǒng)結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)接口、內(nèi)部控制邏輯等內(nèi)部結(jié)構(gòu)并形成掃描結(jié)果報(bào)告文件,測(cè)試員閱讀報(bào)告文件檢查代碼中那些違反編碼規(guī)則的地方是否存在潛在的風(fēng)險(xiǎn)。此次測(cè)試是對(duì)于接口的靜態(tài)掃描,對(duì)于公共庫(kù)的源碼部分未能檢測(cè)到,所以靜態(tài)測(cè)試結(jié)果只是表明在接口二次封裝源代碼中的一些變量定義未使用、變量未初始化等編碼規(guī)范問(wèn)題,其他安全性問(wèn)題本次不進(jìn)行研究。
如圖2所示,TLS通信軟件測(cè)試框架主要包括客戶端測(cè)試驅(qū)動(dòng)和服務(wù)器端測(cè)試驅(qū)動(dòng)2個(gè)大模塊。通過(guò)設(shè)計(jì)客戶端和服務(wù)端測(cè)試驅(qū)動(dòng),調(diào)用GMSSL庫(kù)中相關(guān)接口實(shí)現(xiàn)通信。
圖2 測(cè)試驅(qū)動(dòng)軟件框架
客戶端驅(qū)動(dòng)實(shí)現(xiàn)包括通信初始化(初始化socket、讀取CA證書(shū)、客戶端證書(shū)、客戶端私鑰、網(wǎng)絡(luò)初始化)、連接服務(wù)器、發(fā)送/接收數(shù)據(jù)、通信反初始化(釋放資源)。
服務(wù)器端驅(qū)動(dòng)實(shí)現(xiàn)包括初始化服務(wù)器網(wǎng)絡(luò)(初始化網(wǎng)絡(luò)環(huán)境、初始化TLS環(huán)境)、啟動(dòng)監(jiān)聽(tīng)、接收tcp連接-創(chuàng)建tls連接-接受tls連接、接收客戶端數(shù)據(jù)、定時(shí)發(fā)送數(shù)據(jù)。通信效果如圖3所示。
(a) 服務(wù)器端
基于上述軟件測(cè)試框架的動(dòng)態(tài)測(cè)試主要對(duì)接口的功能實(shí)現(xiàn)正確性、功能實(shí)現(xiàn)的完備性、是否存在內(nèi)存泄漏等進(jìn)行測(cè)試。各類功能的測(cè)試項(xiàng)目如表1~表3所示。
表1 TLS通信測(cè)試項(xiàng)目
表2 讀證書(shū)接口測(cè)試項(xiàng)目
表3 SM2/SM3/SM4測(cè)試項(xiàng)目
通過(guò)場(chǎng)景測(cè)試法設(shè)計(jì)測(cè)試用例對(duì)TLS通信進(jìn)行接口功能驗(yàn)證。TLS通信初始化階段,需要進(jìn)行客戶端或服務(wù)端的證書(shū)驗(yàn)證、證書(shū)是否與私鑰匹配、私鑰是否正確等操作。當(dāng)加載經(jīng)CA簽發(fā)但不匹配的證書(shū)與私鑰文件時(shí),先加載證書(shū)進(jìn)行證書(shū)驗(yàn)證,然后加載私鑰檢查私鑰正確性,最后進(jìn)行證書(shū)與私鑰匹配性檢查,預(yù)期實(shí)現(xiàn)功能是證書(shū)與私鑰不匹配。
通過(guò)測(cè)試發(fā)現(xiàn),若按如上步驟操作,匹配性檢查的結(jié)果是私鑰不正確,沒(méi)有正確實(shí)現(xiàn)匹配性檢查的功能。
修改接口調(diào)用先后順序如下。
先檢查私鑰正確性,在保證私鑰文件正確的前提下進(jìn)行證書(shū)與私鑰的匹配性檢查,此操作的表現(xiàn)能夠正確實(shí)現(xiàn)匹配性檢查的功能要求。
通過(guò)設(shè)計(jì)測(cè)試用例對(duì)讀證書(shū)接口進(jìn)行調(diào)用,測(cè)試項(xiàng)目覆蓋了表2中的內(nèi)容,通過(guò)測(cè)試發(fā)現(xiàn)很有價(jià)值的問(wèn)題。對(duì)于加密的P12證書(shū)文件和加密的私鑰文件,在解析這兩種文件時(shí),庫(kù)函數(shù)的處理方式是不一樣的。讀私鑰文件,文件解析之前就可以知道是否需要密碼,如果不需要就直接丟棄輸入的密碼;讀P12文件時(shí),無(wú)法區(qū)分該類文件是否需要密碼,所以在給一個(gè)不加密的P12文件輸入密碼時(shí)密碼就使用了。對(duì)不加密的P12證書(shū)接口進(jìn)行封裝時(shí),務(wù)必采取相應(yīng)措施確保密碼為空,否則當(dāng)用戶調(diào)用該接口輸入密碼會(huì)引起功能的錯(cuò)誤實(shí)現(xiàn)。
通過(guò)設(shè)計(jì)測(cè)試用例對(duì)SM2、SM3、SM4算法進(jìn)行測(cè)試,通過(guò)測(cè)試發(fā)現(xiàn),對(duì)于SM4加密,當(dāng)加密模式為CFB和OFB時(shí),若在調(diào)用ssl庫(kù)函數(shù)EVP_sms4_cfb()和EVP_sm4_ofb()時(shí)數(shù)據(jù)長(zhǎng)度傳入為0(異常調(diào)用),庫(kù)函數(shù)仍能成功加密。若封裝該庫(kù)函數(shù)時(shí)沒(méi)有考慮此情況,將會(huì)實(shí)現(xiàn)錯(cuò)誤的功能。
基于測(cè)試框架,設(shè)計(jì)多次調(diào)用加密算法接口并自動(dòng)統(tǒng)計(jì)平均耗時(shí)。加解密算法在不同的應(yīng)用平臺(tái),計(jì)算能力差別較大,沒(méi)有統(tǒng)一標(biāo)準(zhǔn),以下記錄均在Win 10,64位操作系統(tǒng),i7-9700 CPU,3.0 GHz處理器上進(jìn)行測(cè)試,針對(duì)SM2、SM3、SM4加解密接口,分別統(tǒng)計(jì)調(diào)用10 000次、100 000次的平均耗時(shí),結(jié)果如表4~表6所示。
表4 SM2簽名/驗(yàn)簽速度
測(cè)試結(jié)果表明:SM2簽名、SM2驗(yàn)簽在調(diào)用10 000次和調(diào)用100 000次時(shí)的平均耗時(shí)均比較穩(wěn)定,說(shuō)明SM2算法在對(duì)消息進(jìn)行簽名和驗(yàn)簽時(shí)不受次數(shù)的影響,同時(shí)被簽名的消息長(zhǎng)度對(duì)簽名和驗(yàn)簽速度的影響也是不存在的。但從上述結(jié)果中可以看出,SM2簽名平均耗時(shí)幾乎是SM2驗(yàn)簽的2倍,原因在于SM2簽名和SM2驗(yàn)簽的算法復(fù)雜度的不同,在簽名過(guò)程中,R、S值和橢圓曲線點(diǎn)計(jì)算占用了大量的時(shí)間資源。
表5是不同長(zhǎng)度消息SM3摘要計(jì)算的平均耗時(shí)測(cè)試結(jié)果,從該結(jié)果可以看出,隨著消息長(zhǎng)度的增大,消息摘要計(jì)算平均耗時(shí)逐漸增多;對(duì)于同一消息,單次計(jì)算和分次計(jì)算雜湊值的時(shí)間開(kāi)銷存在著很大的差別,如當(dāng)消息長(zhǎng)度為1024 Byte時(shí),分512次計(jì)算和單次計(jì)算的耗時(shí)差達(dá)到了10 μs,而對(duì)于同一消息相同長(zhǎng)度的雜湊值分次計(jì)算,調(diào)用10 000次和調(diào)用100 000次的平均耗時(shí)卻幾乎無(wú)差別,也同時(shí)驗(yàn)證了該算法比較穩(wěn)定。
表6為SM4對(duì)于不同長(zhǎng)度的消息進(jìn)行加解密速度測(cè)試結(jié)果,可以看出,隨著數(shù)據(jù)長(zhǎng)度的增大,加解密的耗時(shí)也逐漸增多,當(dāng)數(shù)據(jù)長(zhǎng)度為1024 Byte時(shí),耗時(shí)達(dá)到了26 μs,說(shuō)明消息長(zhǎng)度對(duì)于算法的影響較大。
表6 SM4加解密計(jì)算速度
隨著配電信息數(shù)據(jù)規(guī)模的逐漸增大,對(duì)數(shù)據(jù)安全性的要求越來(lái)越高,安全通信的正確實(shí)現(xiàn)及數(shù)據(jù)加解密速度是電網(wǎng)數(shù)據(jù)交互的重要指標(biāo)。本文通過(guò)對(duì)GMSSL庫(kù)的二次封裝程序進(jìn)行測(cè)試,發(fā)現(xiàn)對(duì)GMSSL庫(kù)中公用接口不能夠正確調(diào)用時(shí),可能會(huì)造成功能實(shí)現(xiàn)的不正確;通過(guò)對(duì)加解密速度進(jìn)行分析,為國(guó)密算法對(duì)不同數(shù)據(jù)長(zhǎng)度的加密通信提供了資源消耗的參考。
本文對(duì)GMSSL庫(kù)中的部分接口在實(shí)現(xiàn)加密通信過(guò)程中的封裝使用方法提出了建議,設(shè)計(jì)的測(cè)試環(huán)境和測(cè)試用例只能覆蓋一些基本功能的測(cè)試,仍需繼續(xù)深化開(kāi)發(fā)研究測(cè)試方法,進(jìn)一步拓展測(cè)試深度。