2016-07-26 23 views
8

當談到安全性,身份驗證策略時,我是一個完整的noob。所以,我正在讀這篇關於「基於令牌身份驗證」: https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authenticationJWT&OAuth2 - 服務器是否存儲令牌?他們如何安全/黑客安全?

我有2個問題:

  1. 我不明白爲什麼一箇中間人(或黑客)將無法看到該令牌是由客戶端發送的,並使用它來模擬客戶端/人員來檢索資源?是什麼讓JSON Web Tokens/OAuth2認證更安全?如果我們每次都使用一次性使用令牌,我會明白,即使黑客可以讀取令牌,他也無法將其用於其他請求。但是,由於令牌在到期之前保持不變,那麼這是一種更安全的認證策略?

  2. 服務器如何知道客戶端發送的令牌是有效的,即服務器在登錄期間與客戶端交換的東西。服務器是否存儲了在數據庫或某個地方生成的令牌,並不斷更新「上次訪問的時間戳」或其他內容,並在last_accessed_time> 1小時前繼續刪除令牌,以便在停用1小時後保持過期?

回答

15

我不明白爲什麼中間人(或黑客)無法看到客戶端發送的令牌,並使用相同的模擬客戶端/人來檢索資源?

智威湯遜並不能保護您免受中間人(MITM)攻擊。如果攻擊者獲得有效的令牌,可以有效地冒充。即使內容被加密。

JWT應該用SSL/TLS連接可以用來避免MITM

使基於JSON網絡令牌/認證的OAuth2在這個意義上更安全嗎?

JWT是一種令牌格式,而oauth2是一種協議。 oauth2可以使用jwt。 Oauth2對使用第三方站點的用戶比較安全,因爲憑證只能從用戶發送到主站點,然後站點發出令牌,第三方站點可以使用該令牌對用戶進行身份驗證。第三方網站永遠不會看到用戶憑據

但是,由於令牌保持不變,直到過期,那麼這是一種更安全的身份驗證策略?

閱讀上面。您需要保護您的令牌不被盜取:主要使用HTTPS或緩解其影響:使用HttpOnly存儲Cookie(如果您不需要訪問客戶端的JWT內容),設置過期時間短,旋轉令牌...

服務器如何知道客戶端發送的令牌是有效的,即一些服務器登錄過程中與客戶交換。

hhhh.pppp.ssss這樣的JWT的第三部分是簽名。簽名是通過頭部和負載(hhhh.pppp)上的服務器私鑰執行的,用於保護內容。如果攻擊者更改內容或簽名,服務器將檢測到它驗證簽名並拒絕驗證。

是否在數據庫中生成的令牌或地方,並不斷更新「最後訪問的時間戳」什麼的服務器存儲,並保持取出令牌,其中last_accessed_time是>1小時前,保持1小時無活動後到期之?

這是不需要的。簽名包裝在令牌本身(ssss)中,因此據說JWT是自包含的

服務器具有密碼密鑰或密鑰對,公鑰和私鑰。令牌使用密鑰(用於HMAC對稱密鑰)進行簽名和驗證,或者使用私鑰簽名並使用相應的公鑰進行驗證(對於RSA非對稱密鑰)

+0

非常棒的解釋。 – user1102532

+0

我能夠實現這一點,它運作良好,但還有另一件事,我不知道.. 我們創建一個令牌,並說我們將其設置爲在15分鐘內過期。無論用戶需要再次認證,它將在15分鐘後過期。但是,只要用戶處於活動狀態並且只有當他/她在15分鐘內處於非活動狀態時纔會刷新此令牌,我纔想要刷新此令牌。我們如何才能做到這一點,因爲令牌存儲在客戶端,即使我們通過解碼base64令牌來更改過期時間戳並將其重新編碼將無法工作。 – user1102532

+1

您無法修改JWT的過期時間,因爲它會破壞簽名,服務器將拒絕該令牌。當令牌即將過期時,您必須將令牌更新。例如,響應請求時,服務器是否發出新的JWT並設置自定義標題作爲響應。或者從客戶端執行特定的AJAX請求以獲取新令牌 – pedrofb

1

這是關於簽署令牌的全部內容。不加密令牌。 服務器只驗證簽名。 JWT未加密(除非您實施它)。 不要將敏感數據存儲在令牌中,因爲默認情況下它未被加密。

+1

此簽名是否針對每個用戶和每個不同的同一用戶的登錄?如果是,服務器在哪裏存儲這些簽名以檢查傳入請求是否有效? – user1102532

+0

您可以將簽名視爲實際令牌的加密校驗和。 當然每個令牌都不一樣,所以簽名是不同的。 服務器只有用於簽署令牌的私鑰/公鑰。 當接收到一個令牌時,服務器通過將該令牌與簽名進行匹配來驗證該令牌是否真實。 中間人攻擊(如果不使用https)可以更改令牌,但他無法知道用於簽署令牌的密鑰,所以服務器會將該令牌標識爲不是真實的,並且會導致呼叫失敗 –