一 概念梳理
對稱加密和非對稱加密是兩種基本的加密方法,它們在現代密碼學中扮演著核心角色,用于保護數據的安全和隱私。
1.1 對稱加密(Symmetric Encryption)
對稱加密是指加密和解密使用同一個密鑰的過程。這意味著發送方和接收方都必須知道并使用這個共享的密鑰來對信息進行加密和解密。這種方法的優點在于加密和解密速度快,效率高,適合處理大量數據。但是,安全分發密鑰成為一個挑戰,因為如果密鑰在傳輸過程中被截獲,那么加密的信息就可能被破解。常用的對稱加密算法有 DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。
1.2 非對稱加密(Asymmetric Encryption)
非對稱加密則使用一對密鑰,分別是公鑰(Public Key)和私鑰(Private Key)。公鑰可以公開給任何人,用于加密信息;而私鑰必須保密,僅由信息的接收者持有,用于解密信息。這種機制解決了密鑰分發的問題,因為即使公鑰被廣泛傳播,只要私鑰保持安全,信息仍然是安全的。非對稱加密的計算復雜度較高,速度相對較慢,因此通常用于加密小量的數據,或者用來安全地交換對稱加密的密鑰。常見的非對稱加密算法有 RSA、DSA(Digital Signature Algorithm)、ECC(Elliptic Curve Cryptography)等。
對稱加密適用于數據的快速加密和解密,但需要安全的密鑰管理機制;而非對稱加密提供了更好的安全性,尤其在密鑰交換方面,盡管其加密和解密過程比對稱加密更耗時。在實際應用中,這兩種加密方式常常結合使用,例如在 HTTPS 的處理中。
二 JWT
2.1 JWT 簡介
JSON Web Token(JWT)是一種輕量級、自包含的安全標準,用于在各方之間安全地傳輸信息。它以 JSON 對象的形式存在,包含三個部分:Header(頭部)、Payload(載荷)和Signature(簽名)。JWT 被廣泛應用于認證、授權和信息交換場景,如單點登錄(SSO)、API 安全認證等。
JWT 的優勢在于:
- 無狀態性:服務器無需存儲會話信息,降低了服務器負擔。
- 自包含:所有必要信息直接包含在 JWT 中,便于跨域傳輸。
- 安全性:通過簽名機制確保數據的完整性和防篡改。
2.2 JWT 如何防篡改
JWT 通過其內置的簽名機制來防止數據被篡改,確保消息的完整性和真實性。JWT 的結構分為三部分:Header、Payload 和 Signature。簽名部分正是 JWT 防止篡改的關鍵所在,其生成和驗證流程如下:
簽名生成過程
-
Header 和 Payload 編碼:首先,JWT 的 Header 和 Payload 分別被 Base64Url 編碼,形成兩段字符串。Header 包含了關于 JWT 的元數據,如簽名算法類型;Payload 則包含了實際要傳輸的數據,如用戶標識、過期時間等。
-
簽名數據準備:將編碼后的 Header 和 Payload 通過
.
連接起來形成一個字符串,這個字符串與用于簽名的密鑰(可以是對稱密鑰或私鑰,依據所選簽名算法而定)一起作為簽名的輸入。 -
簽名計算:根據 Header 中聲明的簽名算法(如 HMAC SHA256、RSA、ECDSA 等),使用密鑰對上述拼接的字符串進行加密計算,產生一個簽名字符串。
-
組合 JWT:最后,將 Base64Url 編碼的 Header、Payload 和新產生的 Signature 通過
.
連接,形成完整的 JWT 字符串。
防篡改驗證過程
-
接收 JWT:接收方首先解析 JWT,將其分割成 Header、Payload 和 Signature 三部分。
-
簽名驗證:再次對 Header 和 Payload 進行 Base64Url 解碼,并使用聲明的簽名算法和相應的密鑰(如果是對稱加密,則與簽名時使用的密鑰相同;如果是非對稱加密,則使用與私鑰配對的公鑰)對這兩部分數據進行計算,生成一個新的簽名字符串。
-
比較簽名:將新生成的簽名與 JWT 中攜帶的原始 Signature 進行對比。如果兩者完全一致,則說明在傳輸過程中 JWT 沒有被篡改,其內容是完整且真實的;若不一致,則表明 JWT 可能被篡改或不是由預期的發送方發出。
三 選擇那種簽名方案
根據上面的介紹,在簽名的時候存在兩類不同的簽名方式:對稱加密和非對稱加密。
選擇使用共享密鑰(HMAC)還是公私鑰對(如RSA、ECDSA)來簽名 JWT 取決于具體的應用場景和安全需求。
3.1 共享密鑰(HMAC)
優點
- 實現簡單:相較于公私鑰對,使用共享密鑰進行簽名和驗證的實現更為直接和快速。
- 計算效率高:HMAC 算法的計算速度通常比 RSA 等非對稱加密算法快,適合對性能有較高要求的場景。
- 密鑰管理相對簡單:只需保護好一個密鑰即可,減少了密鑰管理的復雜度。
缺點
- 密鑰分發風險:所有需要驗證 JWT 的服務都需要訪問這個共享密鑰,增加了密鑰泄露的風險。
- 不支持非對稱操作:無法實現 JWT 的簽發者和服務驗證者之間的分離,因為雙方都需要知道相同的密鑰。
3.2 公私鑰對
優點
- 增強安全性:私鑰保持在簽發者一方,公鑰可以公開,即使 JWT 在傳輸過程中被截取,沒有私鑰也無法偽造 JWT,提高了安全性。
- 分離權限:可以實現簽發和驗證的職責分離,例如,認證服務器使用私鑰簽發 JWT,而各個服務使用公鑰驗證,無需共享私密信息。
- 更靈活的架構設計:適用于分布式系統,特別是當有多個服務需要驗證 JWT,但不應知道用于簽名的私鑰時。
缺點
- 實現復雜度:公私鑰的管理和使用相比 HMAC 更復雜,尤其是在密鑰的生成、存儲和更新方面。
- 性能開銷:非對稱加密算法的計算成本高于對稱加密,可能影響到大規模系統中的性能。
四 小結
如果你的應用場景對性能要求較高,且信任環境較為封閉,可以考慮使用共享密鑰。
若你需要更高的安全性,或者在分布式系統中需要明確分離 JWT 的簽發和驗證權限,公私鑰對會是更好的選擇,盡管它在實現和性能上可能帶來一些挑戰。
如果小伙伴們想要徹底掌握 Spring Security+OAuth2,那么可以看看松哥最近錄制的這套全新的視頻教程。