JWT 簽名用對稱加密還是非對稱加密?

一 概念梳理

對稱加密和非對稱加密是兩種基本的加密方法,它們在現代密碼學中扮演著核心角色,用于保護數據的安全和隱私。

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 防止篡改的關鍵所在,其生成和驗證流程如下:

簽名生成過程

  1. Header 和 Payload 編碼:首先,JWT 的 Header 和 Payload 分別被 Base64Url 編碼,形成兩段字符串。Header 包含了關于 JWT 的元數據,如簽名算法類型;Payload 則包含了實際要傳輸的數據,如用戶標識、過期時間等。

  2. 簽名數據準備:將編碼后的 Header 和 Payload 通過 . 連接起來形成一個字符串,這個字符串與用于簽名的密鑰(可以是對稱密鑰或私鑰,依據所選簽名算法而定)一起作為簽名的輸入。

  3. 簽名計算:根據 Header 中聲明的簽名算法(如 HMAC SHA256、RSA、ECDSA 等),使用密鑰對上述拼接的字符串進行加密計算,產生一個簽名字符串。

  4. 組合 JWT:最后,將 Base64Url 編碼的 Header、Payload 和新產生的 Signature 通過 . 連接,形成完整的 JWT 字符串。

防篡改驗證過程

  1. 接收 JWT:接收方首先解析 JWT,將其分割成 Header、Payload 和 Signature 三部分。

  2. 簽名驗證:再次對 Header 和 Payload 進行 Base64Url 解碼,并使用聲明的簽名算法和相應的密鑰(如果是對稱加密,則與簽名時使用的密鑰相同;如果是非對稱加密,則使用與私鑰配對的公鑰)對這兩部分數據進行計算,生成一個新的簽名字符串。

  3. 比較簽名:將新生成的簽名與 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,那么可以看看松哥最近錄制的這套全新的視頻教程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21431.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

!力扣 108. 將有序數組轉換為二叉搜索樹

給你一個整數數組 nums ,其中元素已經按升序排列,請你將其轉換為一棵 平衡二叉搜索樹。 示例 1: 輸入:nums [-10,-3,0,5,9] 輸出:[0,-3,9,-10,null,5] 解釋:[0,-10,5,null,-3,null,9] 也將被視為正確答案…

封裝了一個使用UICollectionViewLayout 實現的吸附居左banner圖

首先查看效果圖 實現的原理就是通過自定義UICollectionView layout,然后 設置減速速率是快速就可以達到吸附的效果 _collectionView.decelerationRate UIScrollViewDecelerationRateFast; 下面貼出所有代碼 這里是.h // // LBMiddleExpandLayout.h // Liubo…

文章解讀與仿真程序復現思路——電力系統自動化EI\CSCD\北大核心《具有源荷不平衡特性的配電網智能軟開關和儲能聯合規劃》

本專欄欄目提供文章與程序復現思路,具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…

CTF_RE學習

學了一個 map()函數的使用 import base64rawData "e3nifIH9b_CndH" target list(map(ord, rawData)) # map 函數將 rawData 中的每個字符傳遞給 ord 函數。ord 函數返回給定字符的 Unicode 碼點 print(target) # 打印 map 對象的內存地址&…

汽車線束搭鐵與接地

一、搭鐵與接地的概念 首先在這里解釋一下“搭鐵”與“接地”的概念,不要混為一團! 先說接地,大地是可導電的,其電位通常取為零。電力系統和電氣裝置的中性點、電氣設備的外露導電部分及裝置外導電部分通過導體與大地相連&#xf…

MySQL數據庫的約束

MySQL對于數據庫存儲的數據, 做出一些限制性要求, 就叫做數據庫的"約束". 在每一列的 列名, 類型 后面加上"約束". 一. not null (非空) 指定某列不能存儲null值. 二. unique (唯一) 保證這一列的每行必須有唯一值. 我們可以看到, 給 table 的 sn 列插…

【微服務】docker部署redis,一主二從三哨兵,讀寫分離

配置redis讀寫分離 3臺虛擬機 創建目錄用于掛載 mkdir -p /root/redis/{conf,data,logs} #master配置文件 bind 0.0.0.0 //任何ip都能訪問 port 6379 //redis端口號 logfile "/data/redis.log" //日志文件存放位置,啟動redis之前設置為空&#xff…

prometheus docker部署

1.安裝Docker sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors":["https://hub-mirror.c.163.com"] } EOF export DOWNLOAD_URL"https://hub-mirror.163.com/docker-ce" curl -fsSL https://ge…

TypeScript 中的聲明合并

1. 聲明合并的概念 聲明合并是指當 TypeScript 遇到多個同名的聲明時&#xff0c;會將它們合并為一個單一的聲明。這使得開發者可以分散地定義同一個實體的不同部分&#xff0c;最終將它們合并為一個整體。在進行聲明合并時&#xff0c;TypeScript 會根據不同類型的聲明進行不…

【LIN】STM32新能源汽車LIN通信實現過程

【LIN】STM32新能源汽車LIN通信實現過程 文章目錄 前言一、軟件二、接線圖三、硬件原理圖四、上位機五、PICO示波器串行解碼1.軟件中的LIN波特率設置-192002.PIC設置3.PIC串行解碼 六.引用總結 前言 【電機控制】直流有刷電機、無刷電機匯總——持續更新 使用工具&#xff1a;…

godot.bk

1.搜索godot國內鏡像&#xff0c;直接安裝&#xff0c;mono是csharp版本 2.直接解壓&#xff0c;50m&#xff0c;無需安裝&#xff0c;直接運行 3.godot里分為場景&#xff0c;節點 主場景用control場景&#xff0c;下面掛textureact放背景圖片&#xff0c;右鍵實例化子場景把…

961題庫 北航計算機 計算機網絡 附答案 簡答題形式

有題目和答案&#xff0c;沒有解析&#xff0c;不懂的題問大模型即可&#xff0c;無償分享。 第1組 習題 某網絡拓撲如題下圖所示&#xff0c;其中 R 為路由器&#xff0c;主機 H1&#xff5e;H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如圖中所示。現有若干以太網交換機…

Python高效遍歷文件和目錄的方法

在 Python 中&#xff0c;遍歷文件和目錄可以使用 os、pathlib 等模塊。以下是一些高效遍歷文件和目錄的方法&#xff1a; 使用 os.walk() os.walk() 是一個高效的遞歸遍歷指定目錄及其子目錄的方法&#xff0c;它返回一個生成器&#xff0c;生成一個三元組 (root, dirs, fil…

Instruction-Tuningpromote tuning原理,對比區別

Instruction-Tuning 原理 Instruction-Tuning&#xff08;指令調優&#xff09;是一種通過對模型提供明確指令或任務描述&#xff0c;從而提升其在特定任務上的表現的技術。這種方法通過預先定義好的任務說明&#xff08;instructions&#xff09;對模型進行微調&#xff0c;使…

鴻蒙應用開發之OpenGL應用和X組件9

接著下來,我們來分析函數CreateProgram的實現,它是實現著色器程序的編譯、加載和刪除資源。 GLuint EGLCore::CreateProgram(const char *vertexShader, const char *fragShader) { if ((nullptr == vertexShader) || (nullptr == fragShader)) { OH_LOG_Print(L…

MySQL—函數—函數小結

一、引言 前面博客我們已經學完了MySQL的函數&#xff0c;下面快速的對MySQL的函數做一個小結。 在講解了MySQL的函數的時候&#xff0c;主要有四個方面&#xff1a; 1、字符串函數 &#xff08;1&#xff09;CONCAT&#xff1a;字符串連接 &#xff08;2&#xff09;LOWER、…

Java 多線程創建:三種主要方法

多線程編程是Java中一個重要的技術點&#xff0c;它允許程序并行執行多個任務&#xff0c;從而提高程序的執行效率。本文將詳細介紹在Java中創建多線程的三種主要方法&#xff1a;繼承Thread類、實現Runnable接口以及使用Callable和Future接口。 1. 繼承 Thread 類 繼承Threa…

【前端每日基礎】day34——HTTP和HTTPS

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是互聯網通信協議&#xff0c;用于在Web瀏覽器和Web服務器之間傳輸數據。以下是對HTTP和HTTPS的詳細介紹&#xff1a; HTTP&#xff08;Hypertext…

Ubuntu server 24 (Linux) IPtables 雙網卡 共享上網NAT 安裝配置DHCP

一 開啟路由轉發功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安裝DHCP #更新軟件包列表&#xff1a; sudo apt update #安裝DHCP服務器 sudo apt install isc-dhcp-server #修改監聽網卡,根據實際修改 sudo vi /etc/default/isc-dhcp-server …

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理進行身…