【JWT】jwt實現HS、RS、ES、ED簽名與驗簽

JWT 實現 HSRSESED 簽名與驗簽

簽名方式算法密鑰類型簽名要點驗簽要點
HSHMAC-SHA256對稱密鑰- 使用 crypto/hmac 和對稱密鑰生成 HMAC 簽名
- 將 header.payload 作為數據輸入
- 使用同一密鑰重新計算 HMAC 簽名
- 比較計算結果與接收到的簽名是否一致
RSRSA-SHA256公鑰 + 私鑰- 使用 crypto/rsa 生成 RSA 簽名
- 私鑰簽名,輸入為 header.payload 的哈希值
- 使用 crypto/rsa 驗證 RSA 簽名
- 公鑰解密簽名后,驗證是否與輸入哈希值匹配
ESECDSA-P256公鑰 + 私鑰- 使用 crypto/ecdsa 生成 ECDSA 簽名
- 簽名結果為 (r, s),序列化并編碼為 Base64URL
- 使用 crypto/ecdsa 驗證簽名
- 解析簽名為 (r, s),驗證其與 header.payload 的哈希匹配
EDEd25519公鑰 + 私鑰- 使用 crypto/ed25519 私鑰直接簽名完整的 header.payload 數據
- 簽名結果無需額外哈希處理
- 使用 crypto/ed25519 公鑰直接驗證簽名是否匹配完整數據

簽名與驗簽實現重點

  • es算法簽名和驗簽時算法位數必須相同:ES算法在驗簽時必須嚴格使用與簽名時相同位數的算法進行驗證,這一點與其他算法有所不同。(其他算法不必相同) 說明如下:

  • 加密在這里插入圖片描述

  • 驗簽 在這里插入圖片描述

  • Base64URL 編碼:JWT 的 HeaderPayload 都需編碼。

  • 數據輸入:簽名計算與驗證的輸入數據始終是 Base64URL(Header) + "." + Base64URL(Payload)

  • 密鑰管理:對稱密鑰 (HS) 要妥善分發,公私鑰對 (RS/ES/ED) 要安全存儲。


go案例

hs.go

package jwteximport ("github.com/golang-jwt/jwt/v5""log"
)type HS struct {Key        stringSignMethod HSSignMethod
}type HSSignMethod stringconst (HS256 HSSignMethod = "HS256"HS384 HSSignMethod = "HS384"HS512 HSSignMethod = "HS512"
)// hs HMAC(Hash-based Message Authentication Code)用的hash-based
func (hs *HS) getSignMethod() *jwt.SigningMethodHMAC {// *jwt.SigningMethodHMAC 是 jwt.SigningMethod 接口的具體實現之一。通過返回具體的實現類型,// 可以確保你使用的是 HMAC 簽名方法,而不是其他類型的簽名方法(如 RSA 或 ECDSA)。switch hs.SignMethod {case HS256:return jwt.SigningMethodHS256case HS384:return jwt.SigningMethodHS384case HS512:return jwt.SigningMethodHS512default:return jwt.SigningMethodHS256}
}// Sign 簽名
func (hs *HS) Sign(data jwt.Claims) (string, error) {token := jwt.NewWithClaims(hs.getSignMethod(), data)sign, err := token.SignedString([]byte(hs.Key))if err != nil {log.Println(err)return "", err}return sign, nil
}// Verify 驗簽,獲取數據
func (hs *HS) Verify(sign string, data jwt.Claims) error {_, err := jwt.ParseWithClaims(sign, data, func(token *jwt.Token) (interface{}, error) {return []byte(hs.Key), nil})return err
}

rsa.go 私鑰簽名、公鑰驗證

package jwteximport ("github.com/golang-jwt/jwt/v5""log"
)type RS struct {SignMethod RSSignMethodPublicKey  stringPrivateKey string
}type RSSignMethod stringconst (RS256 RSSignMethod = "RS256"RS384 RSSignMethod = "RS384"RS512 RSSignMethod = "RS512"
)func (rs *RS) getSignMethod() *jwt.SigningMethodRSA {switch rs.SignMethod {case RS512:return jwt.SigningMethodRS512case RS384:return jwt.SigningMethodRS384case RS256:return jwt.SigningMethodRS256default:return jwt.SigningMethodRS256}
}// Sign 簽名	私鑰簽名、公鑰驗證
func (rs *RS) Sign(data jwt.Claims) (string, error) {token := jwt.NewWithClaims(rs.getSignMethod(), data)pKey, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(rs.PrivateKey))sign, err := token.SignedString(pKey)if err != nil {log.Println(err)return "", err}return sign, nil
}// Verify 驗簽,獲取數據
func (rs *RS) Verify(sign string, data jwt.Claims) error {_, err := jwt.ParseWithClaims(sign, data, func(token *jwt.Token) (interface{}, error) {return jwt.ParseRSAPublicKeyFromPEM([]byte(rs.PublicKey))})return err
}

es.go 私鑰簽名、公鑰驗證

package jwteximport ("github.com/golang-jwt/jwt/v5""log"
)type ES struct {SignMethod ESSignMethodPublicKey  stringPrivateKey string
}type ESSignMethod stringconst (ES256 ESSignMethod = "ES256"ES384 ESSignMethod = "ES384"ES512 ESSignMethod = "ES512"
)func (es *ES) getSignMethod() *jwt.SigningMethodECDSA {switch es.SignMethod {case ES512:return jwt.SigningMethodES512case ES384:return jwt.SigningMethodES384case ES256:return jwt.SigningMethodES256default:return jwt.SigningMethodES256}
}// Sign 簽名	私鑰簽名、公鑰驗證
func (es *ES) Sign(data jwt.Claims) (string, error) {token := jwt.NewWithClaims(es.getSignMethod(), data)pKey, err := jwt.ParseECPrivateKeyFromPEM([]byte(es.PrivateKey))if err != nil {log.Println(err)return "", err}sign, err := token.SignedString(pKey)if err != nil {log.Println(err)return "", err}return sign, nil
}// Verify 驗簽,獲取數據
func (es *ES) Verify(sign string, data jwt.Claims) error {_, err := jwt.ParseWithClaims(sign, data, func(token *jwt.Token) (interface{}, error) {return jwt.ParseECPublicKeyFromPEM([]byte(es.PublicKey))})return err
}

ed.go 私鑰簽名、公鑰驗證

package jwteximport ("github.com/golang-jwt/jwt/v5""log"
)type ED struct {PrivateKey stringPublicKey  string
}// Sign 簽名
func (ed *ED) Sign(data jwt.Claims) (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodEdDSA, data)pKey, err := jwt.ParseEdPrivateKeyFromPEM([]byte(ed.PrivateKey))if err != nil {log.Println(err)return "", err}sign, err := token.SignedString(pKey)if err != nil {log.Println(err)return "", err}return sign, err
}// Verify 驗簽,并獲取數據
func (ed *ED) Verify(sign string, data jwt.Claims) error {_, err := jwt.ParseWithClaims(sign, data, func(token *jwt.Token) (interface{}, error) {return jwt.ParseEdPublicKeyFromPEM([]byte(ed.PublicKey))})return err
}

jwt.go

package jwteximport ("github.com/golang-jwt/jwt/v5"
)type Data struct {Name   stringAge    intGender intjwt.RegisteredClaims
}type Jwt interface {Sing(data jwt.Claims) (string, error)Verify(sign string, data jwt.Claims) error
}

https://github.com/0voice

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

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

相關文章

地址欄信息location

獲取信息 頁面跳轉 location.href當前地址欄信息 location.assign()設置跳轉新的頁面 location.replace() location.reload()刷新頁面

程序員轉型測試:解鎖漏洞挖掘新旅程

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 程序…

StarRocks常用命令

目錄 1、StarRocks 集群管理&配置命令 2、StarRocks 常用操作命令 3、StarRocks 數據導入和導出 1、StarRocks 集群管理&配置命令 查詢 FE 節點信息 SHOW frontends; SHOW PROC /frontends; mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC /dbs;"…

08-ArcGIS For JavaScript-通過Mesh繪制幾何體(Cylinder,Circle,Box,Pyramid)

目錄 概述代碼實現1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代碼 概述 對于三維場景而言,二位的點、線、面,三維的圓、立方體、圓柱等都是比較常見的三維對象,在ArcGIS For JavaScript中我們知道點…

Linux中page、buffer_head、bio的關系

在Linux中,page、buffer_head、bio這三個概念緊密相關,共同構成了塊設備I/O和內存管理的重要部分,它們的聯系主要體現在以下方面: page與buffer_head 基于page構建:buffer_head通常是基于page來構建的,一…

直線擬合例子 ,嶺回歸擬合直線

目錄 直線擬合,算出離群點 嶺回歸擬合直線: 直線擬合,算出離群點 import cv2 import numpy as np# 輸入的點 points np.array([[51, 149],[122, 374],[225, 376],[340, 382],[463, 391],[535, 298],[596, 400],[689, 406],[821, 407] ], dtypenp.float32)# 使用…

SpringCloud兩種注冊中心

SpringCloud 基本概念 系統架構 我們之前做的所有的項目都屬于單體架構,下面我們將要學習更適合大型項目的分布式架構 單體架構: 將業務的所有功能幾種在一個項目中開發,打成一個包部署。 優點:架構簡單、部署成本低 缺點&am…

SpringAI 搭建智能體(二):搭建客服系統智能體

在現代人工智能應用中,智能體(Agent) 是一個重要的概念,它的核心能力是自主性與靈活性。一個智能體不僅能夠理解用戶的需求,還能拆解任務、調用工具完成具體操作,并在復雜場景中高效運行。在本篇博客中&…

SVN客戶端使用手冊

目錄 一、簡介 二、SVN的安裝與卸載 1. 安裝(公司內部一般會提供安裝包和漢化包,直接到公司內部網盤下載即可,如果找不到可以看下面的教程) 2. 查看SVN版本 ?編輯 3. SVN卸載 三、SVN的基本操作 1. 檢出 2. 清除認證數據 3. 提交…

HTML 文本格式化詳解

在網頁開發中,文本內容的呈現方式直接影響用戶的閱讀體驗。HTML 提供了多種文本格式化元素,可以幫助我們更好地控制文本的顯示效果。本文將詳細介紹 HTML 中的文本格式化元素及其使用方法,幫助你輕松實現網頁文本的美化。 什么是 HTML 文本格…

衡量算法性能的量級標準:算法復雜度

今天開始數據結構的學習!作為一大重點,拿出態度很重要,想要真實掌握,博客筆記自然少不了!重點全部上色!避免疏忽 下面我們從0基礎開始學習今天的第一節!不用擔心看不懂,拒絕枯燥的理…

Spring Boot Starter介紹

前言 大概10來年以前,當時springboot剛剛出現并沒有流行,當時的Java開發者們開發Web應用主要是使用spring整合springmvc或者struts、iBatis、hibernate等開發框架來進行開發。項目里一般有許多xml文件配置,其中配置了很多項目中需要用到的Be…

Java面試題2025-Spring

講師:鄧澎波 Spring面試專題 1.Spring應該很熟悉吧?來介紹下你的Spring的理解 1.1 Spring的發展歷程 先介紹Spring是怎么來的,發展中有哪些核心的節點,當前的最新版本是什么等 通過上圖可以比較清晰的看到Spring的各個時間版本對…

Linux 切換到 Root 用戶的方式及差異詳解

在 Linux 系統中,切換到 root 用戶進行管理和操作是常見需求。不同的切換方法會影響環境變量、工作目錄以及加載的配置文件。本文將介紹幾種常用的切換方式及它們的特點。 切換到 Root 用戶的主要方式 1. sudo su 這是通過 sudo 提權后調用 su 切換到 root 用戶的…

虹科分享 | 汽車NVH小課堂之聽音辨故障

隨著車主開始關注汽車抖動異響問題,如何根據故障現象快速診斷異響來源,成了汽修人的必修課。 一個比較常用的方法就是靠“聽”——“聽音辨故障”。那今天,虹科Pico也整理了幾個不同類型的異響聲音,一起來聽聽看你能答對幾個吧 汽…

淺談Redis

2007 年,一位程序員和朋友一起創建了一個網站。為了解決這個網站的負載問題,他自己定制了一個數據庫。于2009 年開發,稱之為Redis。這位意大利程序員是薩爾瓦托勒桑菲利波(Salvatore Sanfilippo),他被稱為Redis之父,更…

element tbas增加下拉框

使用Tabs 標簽頁的label插槽,嵌入Dropdown 下拉菜單,實現Tabs 標簽頁增加下拉切換功能 Tabs 標簽頁 tab-click"事件"(這個事件當中到擁有下拉框的tab里時,可以存一下Dropdown 第一個菜單的id,實現點擊到擁有…

SQL-leetcode—1179. 重新格式化部門表

1179. 重新格式化部門表 表 Department: ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中,(id, month) 是表的聯合主鍵。 這個表格有關…

【Address Overfitting】解決過擬合的三種方法

目錄 1. 收集更多數據實踐方法:適用場景:優缺點: 2. 特征選擇方法介紹:實踐示例:適用場景:優缺點: 3. 正則化(Regularization)正則化類型:實踐示例&#xff1…

面向通感一體化的非均勻感知信號設計

文章目錄 1 非均勻信號設計的背景分析1.1 基于OFDM波形的感知信號1.2 非均勻信號設計的必要性和可行性1.2 非均勻信號設計的必要性和可行性 3 通感一體化系統中的非均勻信號設計方法3.1 非均勻信號的設計流程(1)均勻感知信號設計(2&#xff0…