提及 TLS,你們必定不會陌生,TLS 能夠說是整個互聯網安全的基石,保障着咱們的通訊數據的安全。自從 2014 年 Heartbleed 漏洞被發現以來,網絡安全受人關注的程度愈來愈高,出於更安全更快捷的需求,TLS 1.3 協議也隨之被提出,其相應的 RFC 於 2018 年正式發佈。隨着網絡安全愈來愈受到重視,安全戰略也逐步上升到國家戰略的高度,國家密碼局在 2010 年末公佈了我國自主研製的「橢圓曲線公鑰密碼算法」(SM2 算法),並隨後陸續發佈了國密算法 SM1-SM9(SM 表明商密的拼音大寫)。今天咱們要分享的東西,就和 TLS 1.3 及國密有關。算法
首先先讓你們對這二者之間的關係有一個基本的概念,咱們以一個典型的 TLS 1.2 中的密鑰套件爲例:segmentfault
對應到咱們的國密的算法上,則各個算法對應的套件以下:安全
一、密鑰交換算法:ECC-SM2,ECDHE-SM2(這裏先不詳細展開,只簡單介紹一下,國密的密鑰交換算法基於當前的橢圓曲線算法設計了兩種專門的算法,而對應的曲線則是 SM2 曲線);網絡
二、數字簽名算法:SM2(SM2 既是簽名算法的名稱,同時在橢圓曲線算法中對應的曲線名也叫 SM2,有的博客文檔裏也將密鑰交換算法稱做 SM2,讀者請注意不要混淆);架構
三、對稱加密算法:SM4;異步
四、hash 算法:SM3。分佈式
也就是說,國密局針對安全握手各個階段所須要的算法都出臺了一份自主可控的算法。性能
先說說爲何要用國密,國密算法做爲國密局的主力產品,確定是在不少地方有優點的,先來總結下國密的典型優點:優化
一、更安全:SM2 做爲一種 ECC 算法(256 位)的安全性是要高於 2048 位的 RSA 的。同時 SM3 的摘要長度爲 256 bit,安全強度也是要高於當時主流的 MD5 算法及 SHA1 算法的。加密
二、更快速:在通信過程當中,256 位的 SM2 算法相比於 2048 位的 RSA 算法(國密算法在設計時,RSA2048 是主流簽名算法,因此這裏暫不討論ECDSA等算法),能夠傳輸更少的數據,也就意味着更少的傳輸時間,而且在理論上來講,SM2 簽名算法的計算速度是要快過 RSA2048 很多的。
三、自主可控:在目前這個國際形勢下,這是最最最關鍵的一點!
國密聽起來像是中國密碼的一次革新,但這些年卻一直沒有大面積推行開來,說明其自己確定有一些問題的,這裏拋開一些細節的小問題,談一談國密算法在大規模落地過程當中遇到的一些比較棘手的問題:
1.速度不夠快(麻煩指數★★★)
國密整個 TLS 會話流程中涉及到的幾個算法,相對主流國際算法來講,大部分狀況下性能均相對弱勢,這裏針對一些給出一些簡單的性能對比表:
對稱加密算法性能對比:
簽名算法性能對比:
hash 算法性能對比:
從對比中咱們能夠看到,國密的這些算法目前和國際算法性能經常不在一個量級,不管是對稱加密仍是非對稱加密的部分。究極根本緣由,仍是因爲各類通用的國際算法普及程度太大,在工程上有着相應的多層次的優化(硬件計算和各類軟加速手段),以對稱加密爲例:國密對稱加密算法 SM4 對標的算法是 aes-128,從自己的加密原理上來看,SM4 在理論上不會和 aes-128 產生如此大的差距,然而 AES 因爲廣泛性實在太強,典型的 AES 實現都基於 Intel 的 SIMD 指令集對其進行了並行化加速,而 SM4 目前只有純軟的實現,性能上天然有不小的差距。不只如此,目前的主流對稱加密模式爲 GCM 及 CCM 模式,其背後的思想爲加密即認證技術(AEAD),而國密算法尚不支持這種模式,在安全性上也存在着一些弱點。
2.須要雙證書(★★★★)
要把雙證書講清楚首先須要你們理解下 PKI 密鑰協商機制,典型的密鑰協商算法分爲兩種:RSA,ECDHE。國密的 ECC-SM2 密鑰協商流程和 RSA 比較相似,算法核心的性質在於用公鑰加密的數據能夠用私鑰解密,整個密鑰協商流程簡化以下圖:
而 ECDHE-SM2 比較相似 ECDHE 算法,均是基於 DH 和 ECC 的算法,理解起來更加容易,流程簡化以下圖:
咱們再來談雙證書這個事情,雙證書分爲簽名證書和加密證書,這套體系的目的是知足國家對於敏感數據強管控訴求,即只要能抓到全部數據包,則管控機構則能夠在理論上恢復出全部明文數據,由此催生出了加密證書這個東西,加密證書的私鑰須要在專門的機構留底。咱們來看 RSA 的密鑰交換流程,只要擁有了私鑰,則中間的密鑰生成的材料(隨機數)也就能夠在理論上進行導出。而對於 ECDHE-SM2 來講,對稱密鑰的導出流程不只僅只由隨機數 a/c 來決定,同時也須要加密證書對應的私鑰參與到計算中(具體流程比較繁瑣,這裏不展開,讀者可參考 GM/T 0024 標準閱讀詳細的細節),也就意味着當私鑰被監管,則對稱密鑰能夠理論上被導出。
這套體系很強悍,但難就難在目前全部主流密碼庫如 openssl,boringssl 都不支持,那麼這也就意味着若是要推動這套體系的普適度,要麼基於主流密碼庫開發,並推動開源社區接受,進而慢慢滲透到國內用戶把這套體系用起來,要麼在儘量兼容目前密碼體系的狀況下開發一套新的密碼庫並強制國內用戶替換,每一種辦法都存在不小的難度。
3.須要客戶端也持有證書(★★★★★)
國密在 GM/T 0024 標準裏面定義了基於 ECDHE-SM2 算法的密鑰交換流程,但這個算法的要求十分苛刻,必需要求 Client 也持有證書,的確這對於安全性有必定提高,但麻煩也就隨之而來,支付寶的客戶端目前沒有證書,若是加上證書會讓 App 更重,握手交互的數據更多,極大下降用戶體驗。這些問題還不夠致命,如何管理海量的端上證書,纔是真正使人頭疼的麻煩。
也許你會問:不用 ECDHE 不就行了嘛,但從技術的演進趨勢來看,高效/安全是咱們孜孜不倦的追求,而類 RSA 的握手流程則從根源上限制了國密 ECC 密鑰交換流程沒法演進到 1-RTT 握手,0-RTT 信息傳輸。不只如此,ECHDE 的安全性及性能,也要好不少。在 TLS 1.3 的 1RTT 標準握手流程中,明肯定義了廢除 RSA 握手,只支持 ECDHE。目前這個狀況就形成了一個死鎖,想用 TLS 1.3->須要 ECDHE->須要 Client 有證書->沒有證書且不想用證書->問題無解。
針對國密落地過程當中的這些痛點問題,2019 年 8 月份,由螞蟻的同窗牽頭,撰寫了一份 TLS 1.3+ 國密算法 draft,並最終成爲了一份 IETF 標準文檔:
整個標準設計的核心思想是:整合目前國密算法優點,全面貼合國際上的安全技術思路,把很差用的東西先暫時剔除掉,提高國密算法在國內及國際上的影響力,從而讓更多組織及我的參與到國密算法的使用和建設中來。基於這個思路,咱們聯合了 360 等公司,通過和國密局的屢次溝通,正式推出了相關標準。在整個流程上,咱們在 ECDHE 算法上取消了 Client 證書的要求,並暫時放寬了雙證書的需求,由此推出了兩個完整的國密算法套件,並肯定了簽名算法及曲線的標準號。同時咱們基於 TLS 1.3 的 AEAD 需求,定義了 SM4 的 GCM 模式和 CCM 模式,並對此作了實現。
整個 draft 定義瞭如下幾個標準(目前這幾個標準都已經拿到了對應的標準號):
國密 SM2 曲線的標準號:curveSM2(41),這個標準號的做用容許 Client 和 server 在進行 TLS 1.3 握手時,使用 curveSM2 做爲約定曲線,至關於讓 ECDHE_SM2 成爲了 TLS 1.3 中的國際標準(固然這裏不須要 Client 持有證書)。
基於 SM2 及 SM3 的簽名算法標準號:sm2sig_sm3(0x0708),這個標準號的功能在於之後在 TLS 1.3 的流程中,若是 server 持有的是國密證書,則能夠默認採用 sm2sig_sm3 做爲簽名算法,而它的意義在於:國密證書今後也成了標準。
基於 TLS 1.3 及 SM2,SM3,SM4 算法的密鑰套件:
TLS_SM4_GCM_SM3(0x00,0xC6)以及 TLS_SM4_CCM_SM3(0x00,0xC7),它意味着今後你能夠按照標準使用 TLS 1.3 的 1RTT 握手 + 國密算法,既知足國家標準要求,又可以快速方便。同時 SM4 算法也用上了更安全的 GCM/CCM 模式。
固然,標準也須要工程化的落地實現,而每每工程實現纔是真正決定一份算法是否好用的絕對因素。針對 SM2/3/4 性能較差的問題,咱們設計並落地了不少方案來進行優化,諸如:異步化的 SM2 硬件加速流程;基於 SIMD 的 SM4 軟優化實現等。基於這些技術,真正作到了讓國密在生產可用,開銷可控。
當日長纓在手,今朝終縛蒼龍。回頭看來,協議從一份草案落地成爲正式的 IETF 標準文檔,差很少通過了兩年左右的時間,期間和 IETF 工做組進行多輪,多方的探討,草案也通過了多輪修訂,最終能修成正果,實屬不易。隨着 TLS 1.3+ 國密正式成爲了國家/國際層面均承認的標準(RFC8998),咱們也正式在 BabaSSL 中支持了相關能力並將其開源,並建設了 BabaSSL 社區。
所謂鵬北海,鳳朝陽,又攜書劍路茫茫,BabaSSL 建設的初心是爲經濟體打造統一/易用的國密密碼庫,但僅僅一份國密的標準的落地與實現毫不會是 BabaSSL 的終點,BabaSSL 會一直朝着更遠的星辰大海奮鬥,咱們正在積極落地着量子隨機數,MPK,Delegated Crendential 等前沿技術,固然,那又是另外一些故事了。
更多文章請掃碼關注「金融級分佈式架構」公衆號