2017-03-07 178 views
1

同事和我一直在試圖理解jwt令牌如何驗證令牌,但是從我們的閱讀中我們似乎混淆了我們自己。驗證jwt令牌[rsa]

請有人可以幫助我確認思維是否正確

  • 令牌使用的私鑰簽名。簽名是使用私鑰加密的頭部和有效載荷的組合,並作爲簽名的最後部分添加到jwt。
  • 爲了驗證令牌,接收者可以使用公鑰來複制此過程。他們加密頭和有效載荷以查看它是否與簽名相同。請注意,這不是解密。接收者不解密令牌(這是我們不確定的主要事情)。 - 接收者不能發出新的令牌,因爲他們沒有私鑰來加密新令牌。

我已經閱讀了RS256和HS256上的jwt文檔,仍然在努力證實我的想法,因此這篇文章。

回答

2

令牌可以使用密鑰對,私人和公共,進行數字簽名或者使用密鑰散列:

  • RS256:RSA KeyPair和SHA256。令牌使用私鑰簽名並使用公鑰進行驗證

  • HS256:使用SHA256的HMAC密鑰。關鍵是要簽名和驗證

緊湊JWT看起來像這樣hhhhh.ppppp.sssss

  • hhhhh相同:JWT的接頭,包括:用於簽名令牌的算法。例如{"alg":"RS256","typ":"JWT"}。編碼在base64url

  • ppppp:JWT的有效載荷,包括像subissexp一些有用的權利要求書。編碼在base64url中

  • sssss:JWT的簽名,使用指定的算法對base64網址的標頭和有效負載進行編碼並在base64中編碼。例如b64(signature(hhhhhh.pppppp))

回答你的問題,你使用密鑰對在客戶端使用公共密鑰(與HMAC密鑰驗證將意味着客戶端和服務器共享密鑰)

驗證令牌指的 RS256

使用上面我寫的算法對令牌進行了簽名(未加密)。爲了驗證,客戶端使用所提供的公鑰驗證該簽名與令牌的第一部分hhhhhh.pppppp匹配。數字簽名驗證是支持所有現代語言的標準操作。請注意,加密/解密不一樣

+0

當您說要驗證時,客戶端使用提供的公鑰驗證該簽名與令牌b64u(hhhhhh).b64u(pppppp)的第一部分匹配._這部分是如何發生的? –

+0

我修正了錯誤:'hhhhh'和'ppppp'在緊湊的JWT中的b64url中編碼。文字可能會混淆。 – pedrofb

+1

客戶端解碼來自base64的簽名並驗證它與提供的公鑰(僞碼'verifyies = verify(signedData,b64_decode(signature),publicKey)',其中'signedData'等於'hhhhh.ppppp'。大多數編程語言本地支持數字簽名驗證(內部它將使用publicKey檢查簽名中包含的哈希值與給定signedData匹配) – pedrofb

0

你可以得到JWT身份驗證令牌的詳細描述官方網站 https://jwt.io/introduction/

+2

我已經讀過,但我們仍然感到困惑。因此,職位。 –