梁正華 弓曉鋒 黃 琳 周 慧
(1.貴州省科技創新中心有限責任公司,貴州貴陽 550002;2.貴州省科技信息中心,貴州貴陽 550002)
傳統軟件設計一般采用單體結構,隨著業務場景越來越復雜,應用范圍越來越廣,分布式軟件架構的應用場景越來越多。近幾年,微服務架構映入開發者的眼簾,微服務架構將軟件系統設計為若干個獨立的、通過網絡通信的服務[1]。傳統軟件設計一般使用在服務端,以保存Session 會話的方式實現用戶的認證授權,但微服務架構中的微服務數量眾多,且常常部署在不同的服務器上,服務之間難以實現Session 的共享。因此,傳統基于Session 的認證授權方式無法用于微服務架構體系,基于令牌Token 的認證授權方式成為一種合理的微服務認證授權體系解決方案,它能夠提供一種合理的方法對微服務的訪問權限進行管理。令牌Token 包含用戶的身份信息和授權信息,并且可以通過加密和簽名確保其完整性和真實性。同時,令牌的發放和驗證過程也可以使用各種安全機制,如隨機數、時間戳等,以防止令牌被篡改或重放。同時,令牌的發放和驗證過程都有記錄,從而可以提供完整的審計跟蹤,便于追蹤和管理用戶訪問權限。基于令牌的認證授權方式還具有良好的擴展性,當需要添加新的微服務或者擴展現有系統時,只需要對令牌進行相應處理即可,無需對每個服務都進行單獨的認證和授權。
OAuth2.0 協議又稱為開放授權2.0 協議,是一種開放的認證授權協議,為各類程序提供了一種簡單、安全的訪問機制。該協議允許用戶授權第三方應用訪問其受保護的資源,而無需直接提供其用戶名和密碼。這種授權方式是通過使用訪問令牌(Access Token)實現的,訪問令牌是由授權服務器頒發給客戶端的,代表用戶對資源進行訪問。OAuth2.0 協議實現了在客戶端不獲取用戶敏感信息(如用戶名、密碼等)的前提下,能夠在一定授權范圍內獲取受保護的資源[2]。OAuth2.0 協議中有4 種執行角色,OAuth2.0 協議中各執行角色進行認證授權的時序圖如圖1 所示。

圖1 各執行角色認證授權時序圖
OAuth2.0 協議用戶進行認證授權的流程如下。(1)客戶端向資源擁有者請求受保護資源的訪問授權。(2)資源擁有者返回受保護資源的授權許可到客戶端。(3)客戶端將獲得的授權許可發送到授權服務器。(4)授權服務器驗證客戶端發送的授權許可。若通過驗證,則返回受保護資源的訪問令牌到客戶端。(5)客戶端將獲得的訪問令牌發送到資源服務器,試圖獲取受保護資源。(6)資源服務器驗證客戶端發送的訪問令牌。若通過驗證,則返回受保護資源,供客戶端使用。
同時,OAuth 2.0 協議定義了4 種授權模式。(1)授權碼模式。該模式是要求最高、訪問流程加密性最高的訪問模式,客戶端與授權服務器根據需要進行相應互動。當用戶登錄授權后,向資源擁有者獲取授權碼,再利用該授權碼從授權服務器得到受保護資源的訪問令牌,最后才能訪問受保護資源。(2)密碼模式。在該模式中,用戶向客戶端輸入用戶名和密碼。客戶端再根據這些信息向權限系統申請受限制資源的訪問權限。該模式由于要求客戶輸入敏感信息(用戶名和密碼),使用時具有較大的局限性,只適用于用戶對客戶端高度信任的環境中。(3)隱藏模式。該模式可以省略用戶向資源擁有者獲取授權碼的步驟,直接向授權服務器要求令牌,授權服務器直接向客戶端頒發令牌。該模式安全性不如授權碼模式,只能用于令牌會話期有效的場景,每次令牌的有效期不長,過期則失效。(4)客戶端憑證模式。該模式不對用戶進行任何驗證,只對客戶端進行驗證,并向客戶端頒發憑證,也就是客戶端令牌。若不同的用戶在同一客戶端登錄,則將共享同一個客戶端令牌。
2010 年,SM3 國產密碼算法由中國國家密碼管理局發布,是我國具有自主知識產權的密碼雜湊算法[3]。SM3國產密碼算法將輸入的消息經過消息填充、消息分組和迭代壓縮等步驟,生成256bit 雜湊值,即散列值。
SM3 算法的實施流程主要包含4 個步驟。一是消息填充。將輸入數據按照512 位的大小分成若干組,最后一組不足512 位時,按規則填充至512 位。填充規則包括先填充一個“1”,后面加上k個“0”,其中k是滿足(n+1+k) mod512=448 的最小正整數。再追加64 位的數據長度(bit 為單位,大端序存放)。二是消息擴展。將一個512 位數據分組劃分為16 個消息字,作為生成的132個消息字的前16 個,再用這16 個消息字遞推生成剩余的116 個消息字。三是迭代壓縮。經過多輪迭代壓縮后,輸出長度為256 位的摘要值。四是輸出結果。將摘要值輸出,作為SM3 算法的結果。
SM3 算法的壓縮函數與國際常用的SHA256 雜湊算法的壓縮函數具有相似性,但SM3 雜湊算法的壓縮函數具有自己的特點,其結構及消息擴展流程設計思路更加復雜。SM3 算法的壓縮函數采用了Merkle-Damg?rd 結構,該結構將輸入的消息分組劃分為多個512 位的塊,然后對每個塊進行迭代壓縮處理。在壓縮過程中,SM3 算法使用了布爾函數、循環移位、模加運算等操作,以確保輸出的哈希值具有高度的混淆和擴散特性。例如,SM3 算法的壓縮函數每一輪使用2 個消息字,消息擴展使用5 個消息字。因此,SM3 國產密碼算法相對于MD5、SHA0、SHA1、SHA256 等常見雜湊算法,在安全性方面優勢突出。
基于OAuth 2.0 的微服務認證授權體系是一種安全機制,可以在多個微服務之間實現授權和訪問控制。該體系利用OAuth 2.0 協議實現對資源的保護和授權,同時支持跨平臺、跨語言應用程序之間的集成和互操作。這種機制下,通過訪問令牌實現對資源的訪問控制,令牌的發放和使用都經過嚴格的授權和驗證,有效防止了未經授權的訪問和數據泄露。同時,這種方式也支持自定義擴展和插件化開發,可以根據實際需求進行個性化定制。
在基于OAuth2.0 的微服務認證授權體系中[4],存在令牌可能被竊取或惡意篡改等風險,具有較大的安全隱患。為解決類似安全問題,可嘗試將SM3 雜湊算法運用于該認證授權體系中,具體流程如下。
(1)OAuth2.0 的微服務認證授權中的授權服務器與資源服務器,協商密鑰SecretKey,該密鑰將用于SM3國產密碼雜湊算法,生成雜湊值,該密鑰只有授權服務器與認證服務器知曉。
(2)授權服務器給客戶端發送授權令牌前,先調用SM3 國產密碼,雜湊算法為該令牌生成雜湊值。例如,AuthCode1=SM3(Token,SecretKey),將該客戶端ID 及對應的令牌雜湊值AuthCode1 發送給資源服務器,資源服務器對該信息進行記錄。
(3)當客戶端向資源服務器發送訪問令牌,試圖訪問受保護資源時,資源服務器使用之前與授權服務器協商好的密鑰SecretKey,調用SM3 國產密碼雜湊算法對客戶端發過來的令牌進行雜湊值生成。例如,AuthCode2=SM3(Token,SecretKey),資源服務器通過客戶端ID,查詢存儲的雜湊值信息,找到該客戶端ID 對應的記錄雜湊值AuthCode1。若AuthCode1 與AuthCode2 相同,則令牌未被篡改,客戶端可進行后續步驟,拿到受保護資源;若AuthCode1 與AuthCode2 不相同,則令牌已被篡改,資源服務器回傳錯誤信息,客戶端獲取受保護資源失敗[5-7]。
用以上步驟改造后的OAuth2.0 協議中各執行角色進行認證授權的時序圖如圖2 所示,第5 和第7 步為改造后增加的步驟。

圖2 改造后的各執行角色進行認證授權時序圖
在基于OAuth2.0 的微服務認證授權體系中,使用自主可控的國產密碼雜湊算法SM3 生成和驗證令牌Token,解決了令牌可能被竊取或惡意篡改的問題,大幅提高了該認證授權體系的安全性。在令牌的驗證過程中,使用SM3 算法可以快速地驗證令牌的有效性,減少系統的響應時間,提高整個系統的性能。國產密碼算法SM3 自主安全可控,完全滿足國家信創要求。
同時,SM3 算法面臨多方面的挑戰。一是密碼分析攻擊。SM3 算法是一種密碼哈希函數,其安全性取決于對輸入數據的哈希能力和對哈希值的抗沖突能力。攻擊者可能會對SM3 算法的內部機制進行攻擊。二是應用于加密貨幣的壓力。SM3 算法作為數字簽名和交易驗證的重要工具,面臨來自黑客和惡意攻擊者的威脅。攻擊者可能會對SM3 算法進行破解,以竊取加密貨幣或破壞交易驗證過程。三是技術更新和兼容性問題。SM3 算法是一種相對較新的密碼算法,其開發和實現需要一定的技術水平和資源投入。同時,一些傳統的密碼算法和系統存在一定的兼容性問題,需要進行技術更新和升級改造。