加密技術科普

語言: CN / TW / HK

我們來自位元組跳動飛書商業應用研發部(Lark Business Applications),目前我們在北京、深圳、上海、武漢、杭州、成都、廣州、三亞都設立了辦公區域。我們關注的產品領域主要在企業經驗管理軟體上,包括飛書 OKR、飛書績效、飛書招聘、飛書人事等 HCM 領域系統,也包括飛書審批、OA、法務、財務、採購、差旅與報銷等系統。歡迎各位加入我們。

本文作者:飛書商業應用研發部 朱忠華

歡迎大家關注飛書技術,每週定期更新飛書技術團隊技術乾貨內容,想看什麼內容,歡迎大家評論區留言~

一、淺談密碼技術

密碼這個詞有很多種的解釋,在現代社會如果不接觸程式設計的話,那麼普遍的認為是我們設定的登入密碼、或者是去銀行取錢時輸入的數字。都是我們在註冊時實現給提供服務的一方儲存一組數字,以後我們登入的時候就用這組數字相當於就證明了我們的身份。這個數字通常來說就是叫做密碼。

而我們需要了解的不是上面說的密碼,而是一種“密碼術”,就是對於要傳遞的資訊按照某種規則進行轉換,從而隱藏資訊的內容。這種方法可以使機密資訊得以在公開的渠道傳遞而不洩密。使用這種方法,要經過加密過程。在加密過程中我們需要知道下面的這些概念:

  • 原文:或者叫明文,就是被隱藏的文字。
  • 加密法:指隱藏原文的法則。
  • 密文:或者叫偽文,指對原文按照加密法處理過後生成的可公開傳遞的文字。
  • 金鑰:在加密法中起決定性的因素,可能是數字、詞彙,也可能是一些字母,或者這些東西的組合。

加密的結果生成了密文,要想讓接受者能夠讀懂這些密文,那麼就要把加密法以及金鑰告訴接受者,否則接受者無法對密文解密,也就無法讀懂原文。

從歷史的角度來看,密碼學大概可以分為古典密碼學和近現代密碼學兩個階段。兩者以現代資訊科技的誕生為分界點,現在所討論的密碼學多指的是後者,建立在資訊理論和數學成果基礎之上的。

1.1 古典密碼學

古典密碼學源自於數千年前,最早在公元前 1900 年左右的古埃及,就出現了通過使用特殊字元和簡單替換式密碼來保護資訊。美索不達米亞平原上曾經出土一個公元前 1500 年左右的泥板,其上記錄了加密描述的陶瓷器上釉的工藝配方。古希臘時期(公元前 800 ﹣前 146 年)還發明瞭通過物理手段來隱藏資訊的“隱寫術”,例如使用牛奶書寫、用蠟覆蓋文字等。後來在古羅馬時期還出現了基於替換加密的凱撒密碼,據稱凱撒曾用此方法與其部下通訊而得以命名。這些手段多數是採用簡單的機械工具來保護祕密,在今天看來毫無疑問是十分簡陋,很容易猜出來的。嚴格來看,可能都很難稱為密碼科學。

凱撒密碼是當偏移量是 3 的時候,所有的字母都 A 都將被替換成 D,B 變成 E,以此類推。

1.2 近代密碼學

近代密碼學的研究來自於第一、二次世界大戰中對於軍事通訊進行保護和猜出來的需求。1901 年 12月,義大利的工程師 Guglielmo Marconi(奎里亞摩•馬可尼)成功完成了跨越大西洋的無線電通訊的實驗,在全球範圍內引發轟動,推動了無線電通訊時代的到來。無線電大大提高了遠端通訊的能力,但是它有一個天然的缺陷——很難限制接收方,這就意味著你所傳的資訊有可能被攔截,因此就催生了加密技術的發展。

對於無線電資訊進行加密和解密也直接促進了近現代密碼學和計算機技術的出現。反過來這些科技進步也影響了時代的發展。一戰時期德國外交部長 Arthur Zimmermann(阿瑟•齊默爾曼)拉攏墨西哥構成抗美軍事同盟的電報(1917 年 1 月 16 日)被英國情報機構— 40 號辦公室破譯,直接導致了美國的參戰;二戰時期德國使用的恩尼格瑪(Enigma)密碼機(當時最先進的加密裝置)被盟軍成功破譯(1939 年到 1941 年),導致大西洋戰役德國失敗。據稱,二戰時期光英國從事密碼學研究的人員就達到 7000 人,而他們的成果使二戰結束的時間至少提前了一到兩年時間。

接下來就是可以稱之為是密碼學發展史上里程碑的事件了。1945 年 9月 1 日,Claude Elwood Shannon(克勞德•艾爾伍德•夏農)完成了劃時代的內部報告《A Mathematical Theory of Cryptography(密碼術的一個數學理論)》,1949 年 10 月,該報告以《Communication Theory of Secrecy Systems(保密系統的通訊理論)》為題在 Bell System Technical Journal(貝爾系統技術期刊)上正式發表。這篇論文首次將密碼學和資訊理論聯絡到一起,為對稱密碼技術提供了數學基礎。這也標誌著近現代密碼學的正式建立。這也是密碼學發展史上的第一座里程碑性事件。

密碼學發展史上的第二個里程碑性事件是 DES 的出現。DES 全稱為 Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的分組密碼演算法,1977 年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),並授權在非密級政府通訊中使用,隨後該演算法在國際上廣泛流傳開來。

密碼學發展史上的第三個里程碑性事件就是我們區塊鏈中廣泛應用的公鑰密碼,也就是非對稱密碼演算法的出現。1976年11月,Whitfield Diffie 和 Martin E.Hellman 在 IEEE Transactions on Information Theory 上發表了論文《New Directions in Cryptography(密碼學的新方向)》,探討了無需傳輸金鑰的保密通訊和簽名認證體系問題,正式開創了現代公鑰密碼學體系的研究。在公鑰密碼發現以前,如果需要保密通訊,通訊雙方事先要對加解密的演算法以及要使用的金鑰進行事先協商,包括送雞毛信,實際上是在傳送金鑰。但自從有了公鑰密碼,需要進行祕密通訊的雙方不再需要進行事前的金鑰協商了。公鑰密碼在理論上是不保密的,在實際上是保密的。也就是說,公鑰密碼是可以猜出來的,但需要極長的時間,等到猜出來了,這個祕密也沒有保密的必要了。

密碼學最基礎的分支有三個,第一個是單向 雜湊函式,第二個是對稱密碼技術,第三個是非對稱密碼技術。那麼接下來我們就以介紹這 3 個概念為主線引出開題中我們提到的概念。

二、摘要演算法

2.1 概念

資料摘要演算法(Digest Algorithm)是密碼學演算法中非常重要的一個分支,它通過對所有資料提取指紋資訊以實現資料簽名、資料完整性校驗等功能,由於其不可逆性,有時候會被用作敏感資訊的加密。資料摘要演算法也被稱為雜湊(Hash)演算法或雜湊演算法,在實現上是一個單向的雜湊函式。

無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的。一般地,只要輸入的訊息不同,對其進行摘要以後產生的摘要訊息也必不相同;但相同的輸入必會產生相同的輸出。只能進行正向的資訊摘要,而無法從摘要中恢復出任何的訊息,甚至根本就找不到任何與原資訊相關的資訊(不可逆性)。

大量的應用都在使用 MD5 或者 SHA 演算法計算一個唯一的 id。比如 Git 中的提交記錄、檔案的完整性校驗、各種語言中字典或者 Map 的實現等等。很多場景下,我們使用雜湊演算法並不是為了滿足什麼加密需求,而是利用它可以對任意長度的輸入,計算出一個定長的 id。

作為密碼學的演算法,雜湊演算法除了提供唯一的 id,其更大的利用價值還在於它的不可逆性。當用戶註冊,提交賬號密碼時,作為一個安全的應用,是絕對不能夠儲存明文密碼的。因此,我們對使用者的密碼通過雜湊演算法進行計算,儲存最終的雜湊值。在後續登入的過程中,我們如果計算出的使用者提交的密碼的雜湊值和你儲存的雜湊值一致,就可以通過驗證了。這樣一來,任何人(即使是內部員工)都不知道使用者真實的密碼是什麼,而使用者也能夠完成密碼的校驗。

摘要演算法實際上是把資料從一個“大空間”對映到了“小空間”,所以就存在“衝突”(collision,也叫碰撞)的可能性,就如同現實中的指紋一樣,可能會有兩份不同的原文對應相同的摘要。好的摘要演算法必須能夠“抵抗衝突”,讓這種可能性儘量地小。

2.2 什麼是單向雜湊函式?

首先,我們從名字上看,一眼就能看出來單向雜湊函式有兩個關鍵修飾詞,“單向”和“雜湊”。其實,在數學上,單向函式和雜湊函式是兩個不同型別的函式。所以,我們要想理解單向雜湊函式,我們就要先知道什麼是單向函式,什麼又是雜湊函式。

單向函式(One-way Function)是正向計算容易,逆向運算困難的函式。也就是說,給定你一個輸入,你很容易計算出輸出;但是給定你一個輸出,你卻很難計算出輸入是什麼。

一個更實用的單向函式,正向計算會更容易,容易程度就是這個函式的計算效能;一個更實用的單向函式,逆向運算會更困難,困難程度就是這個函式的破解強度。一個實用的單向函式,計算強度和破解強度要均衡考量,不可偏廢。

雜湊函式(Hash Function) 是一個可以把任意大小的資料,轉行成固定長度的資料的函式。比如說,無論輸入資料是一個位元組,或者一萬個位元組,輸出資料都是 16 個位元組。我們把轉換後的資料,叫做雜湊值。因為雜湊函式經常被人們直譯為雜湊函式,所以我們也可以稱雜湊值為雜湊值。通常的,對於給定的輸入資料和雜湊函式,雜湊值是確定不變的。

會不會存在雜湊值相同的兩個或者多個數據呢?——是確定存在的。通常,我們把這種情況稱為雜湊值碰撞。對於雜湊函式,雜湊值碰撞可不是一件好事情。

最直觀的辦法,就是在輸出資料的長度上想辦法。雖然雜湊值長度固定,但是,我們可以讓資料變得更長,雜湊值越長,存在相同雜湊值的概率就越小,發生碰撞的可能性就越小。但從另一個角度來說,雜湊值越長,通常也就意味著計算越困難,計算效能越差。雜湊值的長度選擇,應該是權衡效能後的結果。

除了雜湊值長度之外,想要降低雜湊值碰撞的可能性,我們還要考慮雜湊值的質量。一個好的雜湊函式,它的雜湊值應該是均勻分佈的。也就是說,每一個雜湊值出現的概率都是一樣的。如果不這樣的話,一部分雜湊值出現的概率就會較高,另一部分雜湊值出現的概率會較低,別人就更容易構造出兩個或者多個數據,使得它們具有相同的雜湊值。這種行為,叫做碰撞攻擊。

雪崩效應(Avalanche Effect) 是密碼學演算法一個常見的特點,指的是輸入資料的微小變換,就會導致輸出資料的巨大變化。嚴格雪崩效應是雪崩效應的一個形式化指標,我們也常用來衡量均勻分佈。嚴格雪崩效應指的是,如果輸入資料的一位反轉,輸出資料的每一位都有 50% 的概率會發生變化。

一個適用於密碼學的單向雜湊函式,就要具有雪崩效應的特點,也就是說,如果一個單向雜湊函式具有雪崩效應,那麼對於給定的資料,構造出一個新的、具有相同雜湊值的資料是困難的。

2.3 有哪些具體的訊息摘要演算法?

  • CRC8、CRC16、CRC32:CRC(Cyclic Redundancy Check,迴圈冗餘校驗)演算法出現時間較長,應用也十分廣泛,尤其是通訊領域。現在應用最多的就是 CRC32 演算法,它產生一個 4 位元組(32位)的校驗值,一般是以 8 位十六進位制數,如FA 12 CD 45等。CRC 演算法的優點在於簡便、速度快。嚴格的來說,CRC 更應該被稱為資料校驗演算法,但其功能與資料摘要演算法類似,因此也作為測試的可選演算法。
  • MD2 、MD4、MD5:這是應用非常廣泛的一個演算法家族,尤其是 MD5(Message-Digest Algorithm 5,訊息摘要演算法版本5),它由 MD2、MD3、MD4 發展而來,由 Ron Rivest(RSA公司)在 1992 年提出,目前被廣泛應用於資料完整性校驗、資料(訊息)摘要、資料加密等。MD2、MD4、MD5 都產生 16 位元組(128位)的校驗值,一般用32位十六進位制數表示。MD2的演算法較慢但相對安全,MD4 速度很快,但安全性下降,MD5 比 MD4 更安全、速度更快。如果不是長度受限(32 個字元),我還是不推薦你繼續使用 MD5 的。
  • SHA1、SHA256、SHA384、SHA512:SHA(Secure Hash Algorithm)是由美國專門制定密碼演算法的標準機構——美國國家標準技術研究院(NIST)制定的,SHA系列演算法的摘要長度分別為:SHA 為 20 位元組(160位)、SHA256 為 32 位元組(256位)、 SHA384 為 48 位元組(384位)、SHA512 為 64 位元組(512位),由於它產生的資料摘要的長度更長,因此更難以發生碰撞,因此也更為安全,它是未來資料摘要演算法的發展方向。由於 SHA 系列演算法的資料摘要長度較長,因此其運算速度與 MD5 相比,也相對較慢。和 MD5 相同,雖然 SHA 的唯一性也被破解了,但是這也不會構成大的安全問題。目前,SHA-256 普遍被認為是相對安全的雜湊演算法,也是我最推薦你使用的雜湊演算法
  • RIPEMD、PANAMA、TIGER、ADLER32 等:RIPEMD 是 Hans Dobbertin 等 3 人在對 MD4、MD5 缺陷分析基礎上,於 1996 年提出來的,有 4 個標準 128、160、256 和 320,其對應輸出長度分別為 16 位元組、20 位元組、32 位元組和 40 位元組。TIGER 由 Ross 在 1995 年提出。Tiger 號稱是最快的 Hash 演算法,專門為 64 位機器做了優化。
  • 國密 SM3。國密演算法 SM3 是一種雜湊演算法。其屬於國家標準,演算法公開,加密強度和國際標準的 SHA-256 相當。

另外,我們在使用雜湊演算法的時候,有一點需要注意一下,一定要注意加“鹽”。所謂“鹽”,就是一串隨機的字元,是可以公開的。將使用者的密碼“鹽”進行拼接後,再進行雜湊計算,這樣,即使兩個使用者設定了相同的密碼,也會擁有不同的雜湊值。同時,黑客往往會提前計算一個彩虹表來提升暴力破解雜湊值的效率,而我們能夠通過加“鹽”進行對抗。“鹽”值越長,安全性就越高。

總的來說,在使用的時候,你要記住下面這些內容:對稱加密具備較高的安全性和效能,要優先考慮。在一對多的場景中(如多人登入伺服器),存在金鑰分發難題的時候,我們要使用非對稱加密;不需要可逆計算的時候(如儲存密碼),我們就使用雜湊演算法。在具體演算法的選取上,你只需要記住:對稱加密用 AES-CTR、非對稱加密用 ECC、雜湊演算法用 SHA256 加鹽。這些演算法就能夠滿足大部分的使用場景了,並且在未來很長一段時間內,都可以保持一個較高的安全強度。

2.4 HMAC

使用訊息驗證碼的前提,就是資訊的傳送方和接收方要持有相同的金鑰,這和我們前面討論的對稱金鑰的條件是一樣的。能夠使用對稱金鑰的場景,都能夠滿足這個前提。

另外,資訊的傳送方和接收方要使用相同的訊息驗證函式。這個函式的輸入資料就是對稱金鑰和待驗證資訊。資訊的傳送方使用訊息驗證函式,可以生成訊息驗證碼。然後,資訊接收方對比接收到的訊息驗證碼和自己生成的訊息驗證碼。如果兩個訊息驗證碼是一樣的,就表明待驗證資訊不是偽造的資訊。否則,待驗證資訊就是被篡改過的資訊。

HMAC,全稱:基於單向雜湊函式的訊息驗證碼(Hash-based Message Authentication Code)。在 HMAC 的演算法裡,單向雜湊函式的輸入資料是由對稱金鑰和待驗證訊息構造出來的。

到這裡,你是不是早就有了一個疑問,訊息驗證函式為什麼還需要對稱金鑰呢? 我們前面提到,單向雜湊函式也可以驗證資料的完整性。為什麼它不直接使用單向雜湊函式呢?

我們先來看看,如果沒有對稱金鑰的加入,訊息驗證碼還能不能工作。資訊傳送方把待驗證資訊和訊息驗證碼都發送給資訊接收方。假設存在一箇中間攻擊者,能夠解開待驗證資訊和訊息驗證碼。由於單向雜湊函式是公開的演算法,中間攻擊者就可以篡改待驗證資訊,重新生成訊息驗證碼。

然後,中間攻擊者把篡改的資訊和篡改的驗證碼發給資訊接收方。篡改的資訊和篡改的驗證碼能夠通過資訊接收方的資訊驗證。也就是說,這樣的話,資訊接收方就沒有辦法識別出這個資訊是不是原始的、沒有篡改的資訊。這樣,資訊驗證就失效了。

可是,如果對稱金鑰參與了訊息驗證碼的運算,由於中間攻擊者並不知道對稱金鑰的資料,攻擊者就很難偽造出一個能夠通過驗證的訊息驗證碼。換一個說法,對稱金鑰的參與,是為了確保雜湊值來源於原始資料,而不是篡改的資料。

HMAC 演算法是由單向雜湊函式的演算法確定的。下面的表格,我列出了一些常見的演算法。同樣的,我們把 HMAC 演算法也按照退役的、遺留的以及現行的演算法來分類。

其中,HmacSHA256 和 HmacSHA384 是目前最流行的兩個 HMAC 演算法。

三、對稱加密

對稱加密(Symmetric-key algorithm)又稱為對稱加密、私鑰加密、共享金鑰加密,是密碼學中的一類加密演算法。這類演算法在加密和解密時使用相同的金鑰,或是使用兩個可以簡單地相互推算的金鑰。實務上,這組金鑰成為在兩個或多個成員間的共同祕密,以便維持專屬的通訊聯絡。與公開金鑰加密相比,要求雙方取得相同的金鑰是對稱金鑰加密的主要缺點之一。常見的對稱加密演算法有:DES、3DES(TripleDES)、IDEA、AES、ChaCha20、 RC2、RC4、RC5、Blowfish和國密 SM1 和 SM4等。

DES (資料加密標準,Data Encryption Standard)加密演算法是一種分組密碼,以 64 位為分組對資料加密,它的金鑰長度是 56 位(金鑰表面上是 64 位的,然而只有其中的 56 位被實際應用於演算法,其餘 8 位可以用於奇偶校驗。因此,DES 的有效金鑰長度僅為 56 位。),加密解密用同一演算法。DES 加密演算法是對金鑰進行保密,而公開演算法,包括加密和解密演算法。這樣,只有掌握了和傳送方相同金鑰的人才能解讀由 DES 加密演算法加密的密文資料。因此,破譯 DES 加密演算法實際上就是搜尋金鑰的編碼。對於 56 位長度的金鑰來說,如果用窮舉法來進行搜尋的話,其運算次數為 2 的 56 次方。

DES演算法的入口引數有三個:Key、Data、Mode。其中 Key 為 8 個位元組共 64 位,是 DES 演算法的工作金鑰;Data 也為 8 個位元組 64 位,是要被加密或被解密的資料;Mode 為 DES 的工作方式,有兩種:加密或解密。

對應的還有 3DES,3DES(或稱為 Triple DES)是三重資料加密演算法(TDEA,Triple Data Encryption Algorithm)塊密碼的統稱。它相當於是對每個資料塊應用三次 DES 加密演算法。由於計算機運算能力的增強,原版 DES 密碼的金鑰長度變得容易被暴力破解;3DES 即是設計用來提供一種相對簡單的方法,即通過增加 DES 的金鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

DES 實際上是一個過時的密碼學演算法,目前已經不推薦使用了。關於 DES,還有一點特別有意思。DES 包含一個關鍵模組:S 盒,其設計的原理一直沒有公開。因此,很多人都相信,這個 S 盒中存在後門,只要美國政府需要,就能夠解密任何 DES 密文。

IDEA (國際資料加密演算法,International Data Encryption Algorithm)由瑞士研究人員設計,金鑰長度為 128 位。對比於其他的密碼學演算法,IDEA 的優勢在於沒有專利的限制。相比於 DES 和 AES 的使用受到美國政府的控制,IDEA 的設計人員並沒有對其設定太多的限制,這讓 IDEA 在全世界範圍內得到了廣泛地使用和研究。

AES (高階加密標準,Advanced Encryption Standard)加密演算法是密碼學中的高階加密標準,該加密演算法採用對稱分組密碼體制,金鑰長度的最少支援為 128、192、256,分組長度 128 位,演算法應易於各種硬體和軟體實現。這種加密演算法是美國聯邦政府採用的區塊加密標準,AES 標準用來替代原先的 DES,已經被多方分析且廣為全世界所使用。

ChaCha20 是 Google 設計的另一種加密演算法,金鑰長度固定為 256 位,純軟體執行效能要超過 AES,曾經在移動客戶端上比較流行,但 ARMv8 之後也加入了 AES 硬體優化,所以現在不再具有明顯的優勢,但仍然算得上是一個不錯的演算法。

國密 SM1(SM1 Cryptographic Algorithm)和 SM4(SM4 Cryptographic Algorithm)。我們知道,密碼學作為安全的基礎學科,如果全部依靠國外的技術,對於國家安全可能產生不利影響。因此,中國政府提出了一系列加密演算法。其中,國密演算法 SM1 和 SM4 都屬於對稱加密的範疇。SM1 演算法不公開,屬於國家機密,只能通過相關安全產品進行使用。而 SM4 屬於國家標準,演算法公開,可自行實現使用。國密演算法的優點顯而易見:受到國家的支援和認可。

3.1 加密分組模式

對稱演算法還有一個“分組模式”的概念,它可以讓演算法用固定長度的金鑰加密任意長度的明文,把小祕密(即金鑰)轉化為大祕密(即密文)。

最早有 ECB、CBC、CFB、OFB 等幾種分組模式,但都陸續被發現有安全漏洞,所以現在基本都不怎麼用了。最新的分組模式被稱為 AEAD(Authenticated Encryption with Associated Data,帶關聯資料的認證加密),在加密的同時增加了認證的功能,常用的是 GCM、CCM 和 Poly1305

一般地,我們可以把帶關聯資料的認證加密看做一個加密模式,就像 CBC 模式一樣,我們可以和前面提到的 AES 等加密演算法進行組合。但 ChaCha20 和 Poly1305 通常組合在一起;Camellia 與 AES 通常和 GCM 以及 CCM 組合在一起。由於 AEAD 模式相對較新,而 3DES/DES 等遺留或者退役演算法又存在明顯的安全缺陷,所以,我們一般不會使用遺留或者退役演算法的 AEAD 模式。如果我們重新整理一下,綜合考慮加密演算法和加密模式,那麼,當前推薦使用的、有廣泛支援的、風險最小的演算法是:AES/GCM;ChaCha20/Poly1305;AES/CCM

3.2 小節

在加密通訊中(如 HTTPS、VPN、SSH 等),通訊雙方會協商出一個加密演算法和金鑰,對傳輸的資料進行加密,從而防止第三方竊取。在類似資料庫加密這種儲存加密技術中,通訊雙方也是將儲存空間中的資料進行加密,這樣即使硬碟被物理竊取,也不會導致資訊丟失。在公司內部,為了避免使用者的 Cookie 和隱私資訊發生洩漏,也需要對它們進行加密儲存。

對於大部分公司來說,選取 AES128 進行加解密運算,就能獲得較高的安全性和效能。如果是金融或政府行業,在涉及國家層面的對抗上,有一定的合規需求,則需要應用國密演算法。

對稱加密的優點是演算法公開、計算量小、加密速度快、加密效率高。缺點就是金鑰的管理和分發是非常困難的,不夠安全。在資料傳送前,傳送方和接收方必須商定好祕鑰,然後雙方都必須要儲存好祕鑰,如果一方的金鑰被洩露了,那麼加密的資訊也就不安全了。另外,每對使用者每次使用對稱加密演算法時,都需要使用其他人不知道的唯一祕鑰,這會使得收、發雙方所擁有的的鑰匙數量巨大,祕鑰管理也會成為雙方的負擔。

四、非對稱加密

非對稱加密(asymmetric cryptography) 也稱為公開金鑰加密(英語:public-key cryptography,又譯為公開金鑰加密)。它有兩個金鑰,一個叫“公鑰”(public key),一個叫“私鑰”(private key)。兩個金鑰是不同的,“不對稱”,公鑰可以公開給任何人使用,而私鑰必須嚴格保密。

具體的加解密過程就是,傳送方使用公鑰對資訊進行加密,接收方收到密文後,使用私鑰進行解密。具體我也畫了一張圖,你可以和上面的對稱加密演算法的圖一起對照著看一下。可以看到,非對稱加密和對稱加密演算法的最大區別就是,加密和解密使用的金鑰是不同的。

對稱加密看上去好像完美地實現了機密性,但其中有一個很大的問題:如何把金鑰安全地傳遞給對方,術語叫“金鑰交換”。因為在對稱加密演算法中只要持有金鑰就可以解密。如果你和網站約定的金鑰在傳遞途中被黑客竊取,那他就可以在之後隨意解密收發的資料,通訊過程也就沒有機密性可言了。

公鑰和私鑰有個特別的“單向”性,雖然都可以用來加密解密,但公鑰加密後只能用私鑰解密,反過來,私鑰加密後也只能用公鑰解密。非對稱加密可以解決“金鑰交換”的問題。網站祕密保管私鑰,在網上任意分發公鑰,你想要登入網站只要用公鑰加密就行了,密文只能由私鑰持有者才能解密。而黑客因為沒有私鑰,所以就無法破解密文。

非對稱加密演算法一般有 DH、DSA、RSA、ECC、SM2等

RSA 可能是其中最著名的一個,幾乎可以說是非對稱加密的代名詞,它的安全性基於“整數分解”的數學難題,使用兩個超大素數的乘積作為生成金鑰的材料,想要從公鑰推算出私鑰是非常困難的。10 年前 RSA 金鑰的推薦長度是 1024,但隨著計算機運算能力的提高,現在 1024 已經不安全,普遍認為至少要 2048 位。RSA 的數學難題是:兩個大質數 p、q 相乘的結果 n 很容易計算,但是根據 n 去做質因數分解得到 p、q,則需要很大的計算量。RSA 是比較經典的非對稱加密演算法,它的主要優勢就是效能比較快,但想獲得較高的加密強度,需要使用很長的金鑰。

ECC (橢圓加密演算法,Elliptic Curve Cryptography)是非對稱加密裡的“後起之秀”,它基於“橢圓曲線離散對數”的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰,子演算法 ECDHE 用於金鑰交換,ECDSA 用於數字簽名。目前學術界普遍認為,橢圓曲線的難度高於大質數難題,160 位金鑰的 ECC 加密強度,相當於 1088 位金鑰的 RSA。因此,ECC 是目前國際上加密強度最高的非對稱加密演算法。

國密 SM2(SM2 Cryptographic Algorithm)。國密演算法 SM2 也是基於橢圓曲線問題設計的,屬於國家標準,演算法公開,加密強度和國際標準的 ECC 相當。而國密的優勢在於國家的支援和認可。

對比於對稱加密演算法,非對稱加密演算法最大的優勢就是解決金鑰分發的問題。因此,現在大部分的認證和簽名場景,其實使用的都是非對稱加密演算法。比如,在 SSH 登入、Git 上傳等場景中,我們都可以將自己的公鑰上傳到服務端,然後由客戶端儲存私鑰。

五、混合加密

看到這裡,你是不是認為可以拋棄對稱加密,只用非對稱加密來實現機密性呢?很遺憾,雖然非對稱加密沒有“金鑰交換”的問題,但因為它們都是基於複雜的數學難題,運算速度很慢,即使是 ECC 也要比 AES 差上好幾個數量級。如果僅用非對稱加密,雖然保證了安全,但通訊速度有如烏龜、蝸牛,實用性就變成了零。

一組測試資料:RSA 的運算速度是非常慢的,2048 位的加解密大約是 15KB/S(微秒或毫秒級),而 AES128 則是 13MB/S(納秒級),差了幾百倍。

那麼,是不是能夠把對稱加密和非對稱加密結合起來呢,兩者互相取長補短,即能高效地加密解密,又能安全地金鑰交換。

這就是混合加密方式,其實說穿了也很簡單:在通訊剛開始的時候使用非對稱演算法,比如 RSA、ECDHE,首先解決金鑰交換的問題。然後用隨機數產生對稱演算法使用的“會話金鑰”(session key),再用公鑰加密。因為會話金鑰很短,通常只有 16 位元組或 32 位元組,所以慢一點也無所謂。對方拿到密文後用私鑰解密,取出會話金鑰。這樣,雙方就實現了對稱金鑰的安全交換,後續就不再使用非對稱加密,全都使用對稱加密。

這樣混合加密就解決了對稱加密演算法的金鑰交換問題,而且安全和效能兼顧,完美地實現了機密性。

六、數字簽名

數字簽名的原理其實很簡單,就是把公鑰私鑰的用法反過來,之前是公鑰加密、私鑰解密,現在是私鑰加密、公鑰解密。

但又因為非對稱加密效率太低,所以私鑰只加密原文的摘要,這樣運算量就小的多,而且得到的數字簽名也很小,方便保管和傳輸。

簽名和公鑰一樣完全公開,任何人都可以獲取。但這個簽名只有用私鑰對應的公鑰才能解開,拿到摘要後,再比對原文驗證完整性,就可以像簽署檔案一樣證明訊息確實是你發的。

剛才的這兩個行為也有專用術語,叫做“簽名(加簽)”和“驗籤”。只要你和網站互相交換公鑰,就可以用“簽名”和“驗籤”來確認訊息的真實性,因為私鑰保密,黑客不能偽造簽名,就能夠保證通訊雙方的身份。

七、數字證書和 CA

到現在,綜合使用對稱加密、非對稱加密和摘要演算法,我們已經實現了安全的四大特性,是不是已經完美了呢?不是的,這裡還有一個“公鑰的信任”問題。因為誰都可以釋出公鑰,我們還缺少防止黑客偽造公鑰的手段,也就是說,怎麼來判斷這個公鑰就是你或者某寶的公鑰呢?

我們可以用類似金鑰交換的方法來解決公鑰認證問題,用別的私鑰來給公鑰簽名,顯然,這又會陷入“無窮遞迴”。但這次實在是“沒招”了,要終結這個“死迴圈”,就必須引入“外力”,找一個公認的可信第三方,讓它作為“信任的起點,遞迴的終點”,構建起公鑰的信任鏈。

這個“第三方”就是我們常說的 CA(Certificate Authority,證書認證機構) 。它就像網路世界裡的公安局、教育部、公證中心,具有極高的可信度,由它來給各個公鑰簽名,用自身的信譽來保證公鑰無法偽造,是可信的。

CA 對公鑰的簽名認證也是有格式的,不是簡單地把公鑰繫結在持有者身份上就完事了,還要包含序列號、用途、頒發者、有效時間等等,把這些打成一個包再簽名,完整地證明公鑰關聯的各種資訊,形成“數字證書”(Certificate)。

知名的 CA 全世界就那麼幾家,比如 DigiCert、VeriSign、Entrust、Let’s Encrypt 等,它們簽發的證書分 DV、OV、EV 三種,區別在於可信程度。

DV 是最低的,只是域名級別的可信,背後是誰不知道。EV 是最高的,經過了法律和審計的嚴格核查,可以證明網站擁有者的身份(在瀏覽器位址列會顯示出公司的名字,例如 Apple、GitHub 的網站)。

不過,CA 怎麼證明自己呢?

這還是信任鏈的問題。小一點的 CA 可以讓大 CA 簽名認證,但鏈條的最後,也就是 Root CA,就只能自己證明自己了,這個就叫“自簽名證書”(Self-Signed Certificate)或者“根證書”(Root Certificate)。你必須相信,否則整個證書信任鏈就走不下去了。

有了這個證書體系,作業系統和瀏覽器都內建了各大 CA 的根證書,上網的時候只要伺服器發過來它的證書,就可以驗證證書裡的簽名,順著證書鏈(Certificate Chain)一層層地驗證,直到找到根證書,就能夠確定證書是可信的,從而裡面的公鑰也是可信的。

證書體系(PKI,Public Key Infrastructure) 雖然是目前整個網路世界的安全基礎設施,但絕對的安全是不存在的,它也有弱點,還是關鍵的“信任”二字。

如果 CA 失誤或者被欺騙,簽發了錯誤的證書,雖然證書是真的,可它代表的網站卻是假的。還有一種更危險的情況,CA 被黑客攻陷,或者 CA 有惡意,因為它(即根證書)是信任的源頭,整個信任鏈裡的所有證書也就都不可信了。這兩種事情並不是“聳人聽聞”,都曾經實際出現過。所以,需要再給證書體系打上一些補丁。

針對第一種,開發出了 CRL(證書吊銷列表,Certificate revocation list)和 OCSP(線上證書狀態協議,Online Certificate Status Protocol),及時廢止有問題的證書。對於第二種,因為涉及的證書太多,就只能作業系統或者瀏覽器從根上“下狠手”了,撤銷對 CA 的信任,列入“黑名單”,這樣它頒發的所有證書就都會被認為是不安全的。

八、總結

加密演算法的核心思想是“把一個小祕密(金鑰)轉化為一個大祕密(密文訊息)”,守住了小祕密,也就守住了大祕密;

對稱加密只使用一個金鑰,運算速度快,金鑰必須保密,無法做到安全的金鑰交換,常用的有 AES 和 ChaCha20;

非對稱加密使用兩個金鑰:公鑰和私鑰,公鑰可以任意分發而私鑰保密,解決了金鑰交換問題但速度慢,常用的有 RSA 和 ECC;

把對稱加密和非對稱加密結合起來就得到了“又好又快”的混合加密,也就是 TLS 裡使用的加密方式;

摘要演算法用來實現完整性,能夠為資料生成獨一無二的“指紋”,常用的演算法是 SHA-2;

數字簽名是私鑰對摘要的加密,可以由公鑰解密後驗證,實現身份認證和不可否認;

公鑰的分發需要使用數字證書,必須由 CA 的信任鏈來驗證,否則就是不可信的;

作為信任鏈的源頭 CA 有時也會不可信,解決辦法有 CRL、OCSP,還有終止信任。

References

  1. 關於加解密、加簽驗籤那些事
  2. 對稱加密演算法
  3. 極客時間-安全攻防技能30講
  4. 極客時間-透視HTTP協議

加入我們

掃碼發現職位&投遞簡歷

官網投遞:job.toutiao.com/s/FyL7DRg