基于國密算法的設(shè)備安全認(rèn)證系統(tǒng)設(shè)計(jì)
0 引言
我們?nèi)粘I钪惺褂玫碾娮赢a(chǎn)品常常是主機(jī)帶有設(shè)備,如打印機(jī)與墨盒,蘋果手機(jī)與數(shù)據(jù)線。這些主機(jī)與設(shè)備之間一般都有一個(gè)安全認(rèn)證過程,即認(rèn)證該設(shè)備是否合法,只有合法的設(shè)備接入主機(jī)才允許使用,以此保證產(chǎn)品安全可靠地運(yùn)行。在安全認(rèn)證方法上,文獻(xiàn)[1]中討論了使用國際安全算法SHA-256 和ECDSA 的實(shí)現(xiàn)方式,并且只包含了主機(jī)對(duì)設(shè)備的安全認(rèn)證,并沒有設(shè)備對(duì)主機(jī)的安全認(rèn)證,屬于單向認(rèn)證。本文首先討論了基于國密算法的設(shè)備安全認(rèn)證方式,然后設(shè)計(jì)出基于國密算法的設(shè)備單、雙向安全認(rèn)證系統(tǒng)。
作者簡介:許小波(1982—),男,碩士生,主要研究方向?yàn)榍度胧较到y(tǒng)安全,Email: xuxiaobo1997@163.com。
1 國密算法安全認(rèn)證方式
國密算法中包含對(duì)稱密鑰算法SM1、SM4 等和非對(duì)稱密鑰算法SM2[2],對(duì)稱算法即消息發(fā)送和接收雙方使用相同的密鑰進(jìn)行運(yùn)算,其好處是運(yùn)算速度快,缺點(diǎn)是需要嚴(yán)格保管好該密鑰。非對(duì)稱密鑰算法即消息發(fā)送和接收雙方使用不同的密鑰進(jìn)行運(yùn)算,消息發(fā)送方使用私鑰簽名,消息接收方使用公鑰驗(yàn)證簽名,其特點(diǎn)與對(duì)稱密鑰算法正好相反,運(yùn)算速度稍慢,但只需要保管好私鑰就行了,公鑰是可以公開的。基于上述特點(diǎn),在我們的討論的主機(jī)與設(shè)備的安全認(rèn)證中,若是采用對(duì)稱算法,即主機(jī)與設(shè)備都使用相同的的密鑰,這就要求設(shè)備端的密鑰不能被竊取,大大增加設(shè)備端的安全保護(hù)難度。
因此,我們采用國密非對(duì)稱算法SM2。
2 國密算法安全認(rèn)證系統(tǒng)設(shè)計(jì)
首先,預(yù)置認(rèn)證公鑰。我們產(chǎn)生一對(duì)認(rèn)證的SM2密鑰對(duì)Authentication_Private_Key 和Authentication_Public_Key。在設(shè)備生產(chǎn)工廠的安全環(huán)境下,將認(rèn)證公鑰Authentication_Public_Key 預(yù)置到設(shè)備里,其次,用認(rèn)證私鑰對(duì)設(shè)備唯一性數(shù)據(jù)進(jìn)行簽名。設(shè)備里產(chǎn)生一對(duì)設(shè)備的SM2 密鑰對(duì)Device_Private_Key 和Device_Public_Key。導(dǎo)出設(shè)備的Device_Public_Key 和設(shè)備序列號(hào)等設(shè)備唯一性數(shù)據(jù),由認(rèn)證私鑰Authentication_Private_Key 對(duì)其簽名,將簽名信息再置入到設(shè)備里,預(yù)置后的設(shè)備所含數(shù)據(jù)如圖1 所示。以上兩步都是設(shè)備生產(chǎn)工廠的安全環(huán)境下進(jìn)行,同時(shí)要求設(shè)備出廠后對(duì)置入的認(rèn)證公鑰和簽名信息、設(shè)備的SM2 密鑰對(duì)、設(shè)備序列號(hào)等唯一性數(shù)據(jù)不可更改。最后,設(shè)備出廠后認(rèn)證方法如下。
主機(jī)端預(yù)置認(rèn)證公鑰證書Authentication_Public_Key,讀取設(shè)備里的認(rèn)證公鑰信息進(jìn)行比較,不一致則認(rèn)證失??;若一致則繼續(xù)讀取設(shè)備里的設(shè)備公鑰Device_Public_Key、序列號(hào)等唯一性數(shù)據(jù)和簽名信息,進(jìn)行SM2 簽名驗(yàn)證。若簽名驗(yàn)證失敗則設(shè)備認(rèn)證失敗;若簽名驗(yàn)證通過,則進(jìn)一步地向設(shè)備發(fā)送一個(gè)設(shè)備認(rèn)證隨機(jī)數(shù),設(shè)備端用設(shè)備私鑰Device_Private_Key 對(duì)該隨機(jī)數(shù)進(jìn)行SM2 簽名,返回該隨機(jī)數(shù)的簽名信息給主機(jī),主機(jī)端用前面讀取的設(shè)備公鑰Device_Public_Key 對(duì)其進(jìn)行SM2 簽名驗(yàn)證。若簽名驗(yàn)證失敗則設(shè)備認(rèn)證失敗;若簽名驗(yàn)證通過,則主機(jī)對(duì)設(shè)備認(rèn)證成功。整個(gè)處理流程如圖2 所示。
對(duì)于更高安全級(jí)別的系統(tǒng),設(shè)備端也可以對(duì)主機(jī)進(jìn)行認(rèn)證,即雙向認(rèn)證系統(tǒng),其方法為:主機(jī)端除了預(yù)置認(rèn)證公鑰證書Authentication_Public_Key,還預(yù)置有一對(duì)主機(jī)端的SM2 密鑰對(duì)Host_Private_Key 和Host_Public_Key,并且預(yù)置認(rèn)證私鑰Authentication_Private_Key 對(duì)Host_Public_Key 的簽名信息。然后,主機(jī)將Host_Public_Key 和該簽名信息發(fā)送給設(shè)備進(jìn)行SM2簽名驗(yàn)證。若驗(yàn)證通過,主機(jī)再向設(shè)備請(qǐng)求一個(gè)主機(jī)認(rèn)證隨機(jī)數(shù),然后主機(jī)端用主機(jī)端的SM2 私Host_Private_Key 對(duì)該隨機(jī)數(shù)進(jìn)行SM2 簽名,再將其發(fā)送給設(shè)備進(jìn)行SM2 簽名驗(yàn)證。若驗(yàn)證通過,則完成了設(shè)備對(duì)主機(jī)認(rèn)證。整個(gè)處理流程如圖3 所示。
3 國密算法認(rèn)證系統(tǒng)示例
我們以手機(jī)主機(jī)對(duì)電池認(rèn)證為例,在手機(jī)開機(jī)或充電時(shí)手機(jī)主機(jī)對(duì)電池設(shè)備進(jìn)行安全認(rèn)證,只有認(rèn)證成功之后手機(jī)才能開機(jī)運(yùn)行或?qū)ζ涑潆姟榇?,我們需要在電池設(shè)備里增加一顆國密安全芯片,用于和手機(jī)主機(jī)進(jìn)行數(shù)據(jù)交互,預(yù)置公鑰的安全存儲(chǔ)和國密算法的簽名驗(yàn)簽等操作。這里我們選用上海愛信諾航芯電子科技有限公司的國密安全芯片ACL16,它采用32 位ARM Cortex-M0 內(nèi)核,最高主頻48 MHz,集成國密、國際算法等多種安全算法模塊,電壓、頻率、溫度等安全檢測(cè)功能和主動(dòng)金屬屏蔽層保護(hù)、總線加密串?dāng)_等多種保護(hù)功能,擁有USB、SPI、UART、I2C 等豐富的外設(shè)接口,內(nèi)置RC振蕩器,專門面向低成本、低功耗的應(yīng)用領(lǐng)域[3]。
硬件方面,我們采用兩線的I2C 做為手機(jī)主機(jī)與ACL16 的通訊接口,手機(jī)主機(jī)做為I2C 主設(shè)備,ACL16做為I2C 從設(shè)備,再加上電源和地線接口,ACL16 這邊就完成了。由于兩邊I/O 口電壓不同,還需要在手機(jī)主機(jī)端增加一顆電壓轉(zhuǎn)換芯片,以實(shí)現(xiàn)1.8~3.3 V 的電壓轉(zhuǎn)換。整個(gè)硬件框圖如圖4 所示。
軟件方面包括ACL16的安全固件和手機(jī)主機(jī)軟件,我們先來看ACL16 這邊的安全固件。ACL16 在上電后,首先進(jìn)行系統(tǒng)初始化,開啟各安全檢測(cè)模塊,初始化I2C 接口,然后等待接收手機(jī)主機(jī)發(fā)送的命令。待接收完一包命令數(shù)據(jù)后,對(duì)命令數(shù)據(jù)進(jìn)行完整性校驗(yàn),只有校驗(yàn)通過后才對(duì)命令進(jìn)行處理。最后,待命令處理完成,將命令響應(yīng)數(shù)據(jù)發(fā)送給手機(jī)主機(jī)。
手機(jī)主機(jī)方面的軟件分包括,處理與ACL16 通訊的Linux 驅(qū)動(dòng)和Android Java 應(yīng)用層代碼。在Linux 驅(qū)動(dòng)里,主要完成向I2C 總線驅(qū)動(dòng)上注冊(cè)驅(qū)動(dòng),注冊(cè)字符設(shè)備和在/dev 目錄創(chuàng)建設(shè)備文件authenticator,以使應(yīng)用層對(duì)設(shè)備文件authenticator 的讀寫操作時(shí)進(jìn)而對(duì)ACL16 進(jìn)行發(fā)送命令和接收命令響應(yīng)。Android 應(yīng)用層代碼包括JNI 的so 庫和Java 應(yīng)用,其中so 庫主要完成對(duì)authenticator 設(shè)備的打開、讀寫操作,為Java 層提供操作接口。Android Java 應(yīng)用則主要通過調(diào)用so 庫的接口,實(shí)現(xiàn)手機(jī)主機(jī)對(duì)電池的認(rèn)證操作流程和電池對(duì)主機(jī)的認(rèn)證操作流程。對(duì)于JAVA 上的SM2 簽名、驗(yàn)簽操作,其相關(guān)接口采用的是Bouncy Castle 加密庫bcprovjdk15to18-168.jar 中的SM2 接口。Bouncy Castle 加
密庫是澳大利亞非營利組織Bouncy Castle 編寫的輕量級(jí)加密API[4],非常適合在手機(jī)上使用,最新版本為Version 1.68,包含了對(duì)最新CVE 漏洞的修復(fù),以及對(duì)TLS 1.3 版本的支持。我們?cè)谑謾C(jī)演示界面上添加三個(gè)按鈕,分別執(zhí)行主機(jī)認(rèn)證設(shè)備、設(shè)備認(rèn)證主機(jī)和清除顯示日志操作。其中點(diǎn)擊完“主機(jī)認(rèn)證設(shè)備”按鈕后的界面如圖5 所示,點(diǎn)擊完“設(shè)備認(rèn)證主機(jī)”按鈕后的界面如圖6 所示。
圖5 點(diǎn)擊主機(jī)認(rèn)證設(shè)備按鈕后的界面
圖6 點(diǎn)擊設(shè)備認(rèn)證主機(jī)按鈕后的界面
4 結(jié)語
具有國內(nèi)自主知識(shí)產(chǎn)權(quán)的國密算法已經(jīng)在金融領(lǐng)域開展使用,并逐步替代國際安全算法。本文提出了基于國密算法用于設(shè)備的安全認(rèn)證系統(tǒng),可取代現(xiàn)有的國際算法安全認(rèn)證,并可在更廣泛的物聯(lián)網(wǎng)領(lǐng)域進(jìn)行實(shí)際推廣應(yīng)用。
參考文獻(xiàn):
[1] D’ONOFRI M.通過設(shè)備認(rèn)證杜絕造假[J].電子技術(shù)及信息科學(xué),2015(01):32-34.
[2] 國家密碼管理局.SM2橢圓曲線公鑰密碼算法[R/OL].[ 2010-12-17].https://www.oscca.gov.cn/sca/xxgk/2010-12/17/content_1002386.shtml.
[3] ACL16_Datasheet_V2.0.pdf[Z].
[4] Bouncy Castle Cryptography Library[R/OL].https://www.bouncycastle.org/java.html.
(本文來源于《電子產(chǎn)品世界》雜志2021年3月期)
評(píng)論