2016-12-19 53 views
0

我有一個Web應用程序,用戶使用後端Spring MVC服務器登錄。我使用JWT實現它,它的工作原理如下:(如何在驗證JWT時處理每個用戶的簽名密鑰?

  1. 用戶在登錄表單中插入用戶名和密碼。
  2. 我使用SHA256散列密碼,並調用登錄端點在我的MVC發送用戶名和SHA256(密碼)。
  3. 端點檢查用戶是否在場且密碼是否正確(密碼保存爲sha256(密碼)),如果是,則生成一小時過期的JWT,並在其有效負載中設置字段用戶名。我用於JWT的密鑰是用戶相關密鑰,它是在創建用戶時隨機生成的鹽,並保存在數據庫中。最後,我送JWT到瀏覽器
  4. 瀏覽器會保存在智威湯遜在localstorage
  5. 每次調用後端要求的數據,我應該從現在開始

使用JWT我的問題是關於如何通過僅使用JWT讓服務器知道誰在調用端點?

是否有可能在沒有簽名密鑰的有效載荷中獲得用戶名字段?我需要知道哪個用戶觸發它的原因是因爲我必須檢索正確的密鑰來驗證依賴於用戶的JWT。

我的想法是發送爲每個請求的智威湯遜和用戶名。這是做正確的方式還是不需要,我錯過了這個JWT的東西?

回答

1

JWT的系列規範的讓您獲得了令牌(Learn JSON Web Tokens):

  • 只是編碼在友好的格式在HTTP系統(base64url編碼)使用
  • 簽署和編碼
  • 加密和編碼
  • 簽名,加密和編碼

看來你去帶有簽名的令牌,然後使用base64url編碼進行編碼,以便通過HTTP進行傳輸。通過這種方法,您可以在實際需要驗證簽名之前訪問其中包含的數據。例如,請參閱jwt.io,您將能夠看到示例令牌的內容(標頭和有效內容),而無需實際執行簽名驗證。

基於此,您可以在令牌中包含某些內容,以便您知道使用哪個簽名密鑰來驗證簽名。在包含這些信息的地方,kid standard claim似乎是一個很好的候選人。

「孩子」(密鑰ID)標題參數是一個提示,指示使用哪個密鑰來保護JWS。

此外,在您的實現了幾個音符;鑑於用戶提供的密碼通常只有很小的熵(隨機性),您不應該存儲密碼的直接散列。相反,您應該使用合適的庫,在哈希之前使用密碼,並且還使用專門用於密碼散列的算法 - 例如bcrypt


作爲附加的註釋,智威湯遜的那些剛剛簽署和編碼,一般推薦最普遍的方法和一個去。如果您需要在令牌本身中包含敏感信息,則只需考慮使用JWT加密,這會增加很大的複雜性。

相關問題