奚宇航 黃一平 蘇檢德 王淑沛
(廣西師范大學電子工程學院 廣西 桂林 541004)
隨著移動互聯網的迅猛發展,中國已成為全球最大的互聯網市場之一。CNNIC第42次《中國互聯網絡發展狀況統計報告》顯示,截至2018年6月,中國互聯網用戶總數達8.02億,超過印度位居全球網民首位[1]。《2018年中國互聯網流量年度數據報告》中指出截至2018年12月,以微信、QQ為首的即時通信聊天行業獨立設備數達12.35億,同比增長10.3%,行業滲透率達91.67%,其中微信的月獨立設備達10.87億臺,為12月唯一破十億的APP,同比增長9.5%[2]。以QQ和微信所代表的即時通信應用服務在擁有如此龐大數量的用戶基礎上隨之而來的是巨大的安全隱患[3]。用戶使用QQ、微信每天都會接收發送龐大的數據,其信息安全問題值得關注。信息安全保護的核心就是以RSA加密算法和隨機AES密鑰加密相結合進行即時數據加密[4]。雖然RSA的私鑰保存在系統的通信服務器中,想要通過攻克AES算法的密鑰獲取聊天內容的難度很大[5]。但是,一方面由于承擔的流量巨大,運營商或者服務商通常只對包數據中的個人數據進行隱藏,其中通信的大部分還是通過明文的方式進行傳輸,因此存在被竊取和篡改的可能性[6]。另一方面,在手機數據的顯示端是明文顯示,非常容易造成截取傳播敏感社交信息、行政事務信息和金融信息的不良后果,進而造成非常惡劣的影響[7]。
針對上述即時通信軟件存在的安全性問題,本文設計實現了基于國密算法的即時通信加密軟件系統。以iOS操作系統的智能手機終端為例,本文采用隨機密鑰生成器,按照PKI的安全體系,利用對稱與非對稱加密算法相結合的思想,通過具備自主可控、安全性更高、性能更強的國密算法和智能移動終端的手勢、數字密碼鎖相結合技術,實現了即時通信加密軟件系統。本系統在數據傳輸層采用SM2公鑰加密SM4隨機密鑰進行會話密鑰分配,再由SM4密鑰加密明文成密文進行傳輸。在消息顯示層采用手勢、數字密碼鎖的方式進行顯示保護。
整個通信系統由系統服務器、蘋果APNs服務器和手機移動客戶端組成。其中手機移動客戶端主要由密聊首頁、聯系人和個人三個界面組成,系統的即時通信總流程圖如圖1所示。圖中實線表示移動端A給移動端B發送即時消息,虛線為移動端B給移動端A發送即時消息,ID為系統服務器隨機給移動端分配的標識符,UUID為移動客戶端的蘋果手機唯一標識符,其中ID和UUID形成鍵值對保存在系統服務器中,UUID可以被蘋果的APNs服務器識別。在移動客戶端進行三方登錄成功后會由隨機密鑰生成器生成國密算法的SM2的公私鑰對,公鑰上傳服務器,私鑰保存在Keychain中。每次進行三方登錄會更新Keychain中保存的私鑰,同時更新系統服務器公鑰。在首次即時通信的同時進行統一會話密鑰操作,之后在移動客戶端進行發送消息時,發送方通過統一的會話密鑰將消息加密成密文和接收方的ID發送給服務器,由系統服務器找到ID對應的UUID,然后由蘋果的APNs服務器將密文消息推送給接收方移動客戶端進行會話密鑰解密,最后通過手勢數字密碼驗證成功后進行顯示。

圖1 系統即時通信總流程圖
Keychain是一個獨立于APP之外的iOS系統級別安全的存儲容器,可以用來為不同的應用保存敏感信息[8],比如私鑰、密碼、網絡密碼、認證令牌等。蘋果用Keychain來保存Wi-Fi密碼、VPN憑證等。Keychain中的Keychain Services安全機制保證存儲的敏感信息不會被竊取,它可以包含任意數量的Keychain item,每條item 包含一條數據和很多的屬性。每個Keychain包含數據和一組屬性,對于需要保護的item,比如私鑰或密碼數據是加密的,會被Keychain保護起來;對于無需保護的item,比如證書數據未被加密。Keychain一共有五種類型:一般密碼、網絡密碼、證書、密鑰和身份證書(帶私鑰的證書),分別對應GenericPassword、InternetPassword、Certificate、Key和Identity[9]。本系統在三方登錄成功后自動生成SM2密鑰對,其中公鑰上傳系統服務器,私鑰通過item關聯Key類型保存在Keychain中,在統一會話密鑰操作的過程中采用相同的方式將密鑰保存在Keychain中。
國產密碼算法簡稱國密算法是由國家密碼局認定的擁有自主知識產權的密碼算法,在目前互聯網領域使用最為廣泛加密算法為SM2、SM3、SM4。其中SM2算法是基于ECC橢圓曲線密碼機制使用256位曲線作為標準曲線的非對稱加密算法,求解倍點的離散對數的難度遠遠大于大數分解和有限域上的離散對數求解,與目前使用最多的RSA非對稱加密算法比較來看,其計算復雜度、安全度更高,相同安全性能下需要的公鑰位數更少,加解密速度更快,在密鑰生成速度上比RSA快百倍以上[10]。SM4是一種基于分組密碼的對稱加密算法,可實現對數據的實時加解密,保證數據的機密性,其加密機制是對明文消息進行固定塊切割后再進行迭代加密,加密解密使用相同的密鑰[11]。與目前使用較多的AES對稱加密算法比較來看,在進行疊加加密輪操作的過程中兩個算法的安全性均是基于S盒的非線性以及線性變換提供擴散作用,密鑰的使用方式也均是將密鑰與明文或加密結果“異或”。區別在于AES算法在每輪的最后使用密鑰,而SM4算法在每輪開始使用密鑰,在密鑰調度算法的復雜度上,SM4更加簡單[12]。故本系統在進行即時消息加密和統一會話密鑰的過程中采用了安全性更高、自主可控性更好的國密算法進行即時消息加解密操作,這也更加符合國家自主可控的安全發展需求。
系統采用了C/S架構模式,服務器端使用了J2EE標準、Spring框架和MySQL數據庫,使用Java語言進行開發,連接遵循Http協議。移動客戶端使用Objective-C語言進行開發,使用MVC架構和SQLite數據庫,測試環境為iPhone simulator和iPhone真機。
系統對于即時消息的安全措施有兩個方面:消息顯示查閱層和傳輸層。在消息傳輸層中,移動客戶端在三方登錄后首先會自動隨機生成SM2加密算法的公鑰、私鑰對,公鑰上傳到本地服務器,私鑰保存到Keychain。三方登錄成功后進入密聊首頁進行添加好友的操作,好友添加成功是進行統一會話的前提,在互為好友進行第一次即時聊天時會通過拼接消息密文和會話密鑰密文進行統一會話密鑰操作,之后的即時消息加解密使用統一后的密鑰。
系統在接收顯示查閱端采用手勢密碼和數字密碼結合進行顯示安全驗證保護。在聊天室顯示聊天會話消息的時候會先進行手勢密碼解密校驗,判斷是不是第一次進入聊天室。如果是第一次進入聊天室則顯示明文,之后再次進入聊天室全部消息統一顯示“消息已加密!”,只有先設置手勢密碼才能對聊天室中消息進行解密后明文顯示。在二次進入軟件時會進行數字密碼解密校驗,不論軟件是從熄屏狀態、掛起后臺還是完全殺死重新進入軟件均需執行數字密碼校驗后才能進入軟件,數字密碼不要求用戶強制設置。不進行數字密碼設置二次進入軟件后就不會喚起數字密碼鎖。
系統的三方登錄是進入系統軟件的首步操作,包含了通過SDK獲取關聯值,登錄系統服務器和添加用戶信息。系統采用嵌入QQ和微信的SDK進行三方登錄,使用三方登錄對于用戶來說能夠顯著降低用戶的注冊和登錄成本,方便用戶實現快捷登錄或者注冊;對應用來說降低了用戶注冊登錄繁瑣成本,減少隱形客戶流失提高注冊轉化率;對第三方而言促進用戶粘性,有利于對平臺的拉新促活。三方登錄成功后會生成SM2的公私密鑰對,公鑰上傳系統服務器,私鑰保存在Keychain中,詳細步驟如下:
(1) 通過QQ或微信的SDK三方登錄成功后得到微信或QQ關聯登錄用戶的唯一標識uid和關聯登錄token,否則重新進行三方登錄操作。
(2) 調用系統服務器的“服務器登錄”接口傳遞uid和token參數,成功后會返回系統ID、系統昵稱nickname、系統頭像icon,否則重新登錄系統服務器。
(3) 調用隨機密碼生成器生成SM2的公、私鑰對(Uk,Pk),其中私鑰保存在Keychain中。
(4) 調用系統服務器的“添加用戶信息接口”傳遞ID和Uk參數到系統服務器,并以鍵值對的形式保存在數據庫中。用戶信息添加成功后跳轉到密聊首頁,否則重新進行添加。
三方登錄的流程圖如圖2所示。
添加好友是建立即時會話的前提,只有添加好友成功后,才能建立即時會話,統一會話密鑰。在添加好友時掃描對方二維碼獲得系統對應的身份信息ID后會先與自己的ID進行比較。如果相同會彈出窗口“不能添加自己為好友!”;如果不相同則會和自己的聯系人列表中的所有好友ID進行比較,如果有相同的,則直接跳轉到與該聯系人的聊天室界面,如果都不相同就會進行添加好友操作,向對方發送添加好友請求的即時推送,對方得到推送消息后同意添加則添加成功,反之不成功。系統的添加好友流程圖如圖3所示。

圖3 添加好友流程圖
本系統在即時消息的推送過程中使用系統服務器和蘋果原生的APNs服務器結合進行推送。系統具體推送步驟如下:
(1) 發送方Sender調用系統服務器的即時消息推送API接口接收會話密文消息Message和接收方Receiver的ID。
(2) 數據庫保存Message并生成對應的字段Num。
(3) 根據Num生成一個URL查詢地址Address,并且通過Receiver的ID找到對應的UUID。
(4) 調用APNs的接口將Address和UUID發送給APNs服務器,APNs根據UUID找到Receiver并推送Address即時消息。
在即時消息的推送過程中由于APNs每次推送的字節數有限,較長字節數的即時消息不能一次性推送完,所以通過訪問URL查詢地址獲得完整的即時推送消息。系統的即時推送流程圖如圖4所示。

圖4 即時推送流程圖
本系統在即時會話消息的傳輸過程中基于PKI的安全體系,采用數字信封的方式進行統一會話密鑰分發。數字信封的原理就是采用對稱加密算法加密大批量的數據,然后采用非對稱加密算法對其中的對稱密鑰進行加密[13]。在解密的過程中首先用非對稱加密算法解密獲取對稱加密算法的密鑰,然后使用獲取的密鑰解密獲取數據明文[14]。本系統在安全傳輸中主要包括兩大部分:第一次建立即時會話時進行統一會話密鑰操作;使用統一后的密鑰對即時會話消息進行加密解密。
2.4.1統一會話密鑰
系統在Sender(發送方)和Receiver(接收方)互為好友的前提下第一次進行即時聊天會統一會話密鑰,具體步驟如下:
(1) Sender打開與Receiver的聊天室,監聽此時聊天室的文字輸入。
(2) 監聽聊天室鍵盤中的“Send”按鈕的點擊,此時的即時會話明文為C1。
(3) 隨機密碼生成器會自動生成定長的SM4會話密鑰Mk,并在Sender中的Keychain進行存儲。同時通過Receiver的ID向系統服務器獲取其SM2的公鑰Pk。
(4) 通過公鑰Pk加密Mk生成定長的會話密鑰密文Ck。同時使用會話密鑰Mk加密明文即時消息C1成C。拼接Ck和C成即時消息密文Message。
(5) 向系統服務器發送Message和Receiver的ID,系統服務器生成URL查詢地址Address,調用APNs服務器接口發送Address和ID。
(6) APNs服務器通過ID將Address推送給Receiver。
(7) Receiver通過向Address發送POST請求獲取到拼接的密文消息Message,截取定長的會話密鑰密文Ck和即時密文消息C。
(8) Receiver用自己的私鑰Uk解密Ck得到Mk,在Receiver中Keychain中存儲Mk,同時用Mk解密C得到即時消息明文C1,并在Receiver的聊天室中顯示。
當Sender和Receiver互加好友后的第一次即時聊天時,會在傳遞首條即時消息時同時傳遞會話密鑰,經過第一條即時消息后Sender和Receiver就保持了統一的會話密鑰,之后的即時聊天信息加解密全部使用Mk,本系統不作密鑰的預先設定,每次三方登錄后都會產生的新的SM2密鑰對定期更新會話密鑰。系統的統一會話密鑰流程如圖5所示。

圖5 統一會話密鑰流程圖
2.4.2即時消息加解密
在Sender進行即時聊天中首先會判斷是不是第一次與該好友進行即時會話,如果是,則會在第一次發送即時消息時進行統一會話密鑰操作,如圖5所示;如果不是,那么雙方已經統一了會話密鑰Mk,此時Sender只需要向系統服務器發送即時消息密文C和Receiver的ID,APNs調用推送接口推送的URL查詢地址中只有即時消息密文C,Receiver接收到即時推送消息密文C,直接用本地保存的會話密鑰Mk解密即可。同時在即時消息解密后在聊天室進行顯示時要經過手勢數字密碼驗證成功后才會顯示即時消息明文。系統在Sender和Receiver進行即時會話通信中的消息加解密流程圖如圖6所示。

圖6 即時消息加解密流程圖
系統在對解密后的會話消息查閱的安全設計中采用數字、手勢密碼驗證對會話消息進行安全保護。其中數字密碼是進入APP時的安全驗證,手勢密碼是在聊天中顯示明文消息時的安全驗證。詳細信息查閱驗證流程如下:
(1) 在進入軟件的過程中判斷如果是從熄屏狀態、后臺狀態、完全殺死狀態進入軟件,那么就會查看用戶有沒有設置數字密碼安全保護。如果設置了則會進入數字密碼安全驗證,驗證成功進入軟件,驗證不成功則無法打開軟件;如果沒有設置數字密碼安全驗證則直接進入軟件。
(2) 當進入軟件后來到聊天室進行消息明文查閱時,判斷是否第一次進入聊天室,如果是,則直接顯示明文,否則進行手勢密碼安全驗證。
(3) 在進行手勢密碼安全驗證前,聊天室顯示的聊天內容全部為“消息已加密!”,點擊聊天室的“解密”按鈕,判斷用戶有沒有設置手勢安全驗證密碼。如果設置了就直接進行手勢安全驗證,否則提示“請先設置手勢密碼”。設置成功后進行手勢密碼安全驗證,驗證成功后聊天記錄刷新顯示為明文消息。系統的信息查閱安全驗證流程如圖7所示。

(a) 數字密碼驗證 (b) 手勢密碼驗證
本系統設計的創新點首要是在加密算法的選擇上采用了安全性更高的自主國密算法,使得本系統在即時消息傳輸中更加安全;其次在公鑰和會話密鑰的保存中使用了Keychain安全存儲容器,并且不對密鑰做預先設定,每次三方登錄會同步更新Keychain和系統服務器中的密鑰,使得本系統在密鑰保存中相對更加靈活安全;最后在信息查閱中設計了數字密碼和手勢密碼安全驗證兩層保護,使得聊天室中的即時會話消息不能隨意被查閱截取傳閱,提高了信息查閱的安全性。
系統的客戶端實際應用效果圖如圖8、圖9所示。其中,圖8是手勢、數字密碼的界面圖,圖9是聊天室即時會話消息界面圖。由圖9可見在進入聊天室后顯示的消息均為“消息已加密!”如果沒有設置手勢密碼會提示“請先設置手勢密碼”,設置之后進入聊天室點擊右上角的“解密”按鈕,此時經過手勢安全驗證得到最終的明文即時會話消息。

圖8 設置手勢數字密碼界面圖

圖9 聊天室會話消息圖
本文研究的基于國密算法的即時通信加密軟件系統依靠iOS平臺設計并實現,在服務器端的即時消息傳輸層和移動客戶端的即時消息顯示層都進行了安全措施保護。在即時消息經過服務器進行即時推送的過程中使用非對稱加密算法分發對稱加密算法的密鑰,并且在即時消息經過移動客戶端進行即時消息查閱顯示的過程中使用了手勢、數字密碼結合的方式對即時消息顯示進行加密保護,最終設計并實現了本軟件系統。該系統目前已在企業進行了試用,取得了不錯的應用效果,滿足商務人士更高要求的信息安全需求,具有較好的應用前景。本文設計方案也將為即時通信的安全方案提供有益參考。