C#簽名算法HS256和RS256實(shí)戰(zhàn)演練
一、RS256和HS256的區(qū)別
HS256 使用密鑰生成固定的簽名,RS256 使用成非對(duì)稱進(jìn)行簽名。
簡(jiǎn)單地說,HS256 必須與任何想要驗(yàn)證 JWT的 客戶端或 API 共享秘密。
RS256 生成非對(duì)稱簽名,這意味著必須使用私鑰來簽簽名 JWT,并且必須使用對(duì)應(yīng)的公鑰來驗(yàn)證簽名。與對(duì)稱算法不同,使用 RS256 可以保證服務(wù)端是 JWT 的簽名者,因?yàn)榉?wù)端是唯一擁有私鑰的一方。這樣做將不再需要在許多應(yīng)用程序之間共享私鑰。
二、JWT常用的兩種簽名算法
JWT簽名算法中,一般有兩個(gè)選擇,一個(gè)采用HS256,另外一個(gè)就是采用RS256。
簽名實(shí)際上是一個(gè)加密的過程,生成一段標(biāo)識(shí)(也是JWT的一部分)作為接收方驗(yàn)證信息是否被篡改的依據(jù)。
RS256 (采用SHA-256 的 RSA 簽名) 是一種非對(duì)稱算法, 它使用公共/私鑰對(duì): 標(biāo)識(shí)提供方采用私鑰生成簽名, JWT 的使用方獲取公鑰以驗(yàn)證簽名。由于公鑰 (與私鑰相比) 不需要保護(hù), 因此大多數(shù)標(biāo)識(shí)提供方使其易于使用方獲取和使用 (通常通過一個(gè)元數(shù)據(jù)URL)。
另一方面, HS256 (帶有 SHA-256 的 HMAC 是一種對(duì)稱算法, 雙方之間僅共享一個(gè) 密鑰。由于使用相同的密鑰生成簽名和驗(yàn)證簽名, 因此必須注意確保密鑰不被泄密。
在開發(fā)應(yīng)用的時(shí)候啟用JWT,使用RS256更加安全,你可以控制誰能使用什么類型的密鑰。另外,如果你無法控制客戶端,無法做到密鑰的完全保密,RS256會(huì)是個(gè)更佳的選擇,JWT的使用方只需要知道公鑰。
由于公鑰通??梢詮脑獢?shù)據(jù)URL節(jié)點(diǎn)獲得,因此可以對(duì)客戶端進(jìn)行進(jìn)行編程以自動(dòng)檢索公鑰。如果采用這種方式,從服務(wù)器上直接下載公鑰信息,可以有效的減少配置信息。
三、JWT介紹
JWT 代表 JSON Web Token ,它是一種用于認(rèn)證頭部的 token 格式。這個(gè) token 幫你實(shí)現(xiàn)了在兩個(gè)系統(tǒng)之間以一種安全的方式傳遞信息。出于教學(xué)目的,我們暫且把 JWT 作為“不記名 token”。一個(gè)不記名 token 包含了三部分:header,payload,signature。
header 是 token 的一部分,用來存放 token 的類型和編碼方式,通常是使用 base-64 編碼。
payload 包含了信息。你可以存放任一種信息,比如用戶信息,產(chǎn)品信息等。它們都是使用 base-64 編碼方式進(jìn)行存儲(chǔ)。
signature 包括了 header,payload 和密鑰的混合體。密鑰必須安全地保存儲(chǔ)在服務(wù)端。
你可以在下面看到 JWT 剛要和一個(gè)實(shí)例 token:
四、HS256和RS256實(shí)戰(zhàn)演練
一、HS256使用:
根據(jù)指定用戶生成Token

驗(yàn)證指定用戶的Token是否有效

二、HS256使用:
生成一個(gè)rsa非對(duì)稱密鑰對(duì)。

私鑰加密,公鑰驗(yàn)簽。

五、源代碼示例下載
非常感謝對(duì)【跟著阿笨一起玩NET】的支持,有問題微信公眾號(hào)回復(fù)wx關(guān)鍵字,加阿笨的個(gè)人微信號(hào)。
《C#簽名算法HS256和RS256實(shí)戰(zhàn)演練》源碼下載
關(guān)注公眾號(hào)回復(fù)關(guān)鍵字提取碼:8ks5

騰訊課堂
網(wǎng)易云課堂


