2016-02-05 52 views
3

我一直在使用Tomcat API發送/接收數據,登錄,註銷等的Android/IOS應用程序。我的主要身份驗證方式是使用SHA-512通過JSON Web令牌與HMAC進行身份驗證。認證照常進行。用戶提供他們的憑證(用戶名和密碼)第一次登錄。服務器驗證憑證,如果它們是正確的,它會生成並返回一個JWT給用戶,他們可以使用它來在將來的請求中驗證自己。該令牌包含一個自定義聲明,該自定義聲明指定了用於識別哪個用戶發出請求的用戶ID。我做了一些關於智威湯遜的研究,關於許多問題的觀點是不一致的。我有幾個問題,我希望你可以點亮:關於JSON Web令牌安全性的幾個問題?

1-使用JWT作爲我的API的唯一身份驗證機制足夠嗎?在安全性方面,使用HMAC的JWT和使用RSA的JWT有什麼不同?

3-理想情況下,我應該在哪裏存儲我簽署令牌的對稱簽名密鑰?目前,我將密鑰直接傳遞給生成我的令牌的函數。這樣做安全嗎?

4-我是否應該定期更改簽名密鑰以獲得更好的安全性?

5-我可以信任我插入令牌中標識提出請求的用戶的userID聲明嗎?

6-是否有令牌的「理想」到期時間?有些人建議只要15分鐘,而另一些人則說3小時沒事。

7-我應該擔心限制特定用戶可以擁有的令牌數量嗎?用戶可能有多個移動設備,並且在任何時候都可能有多個令牌。在這種情況下,沒有任何東西阻止用戶從我的服務器獲取數千令牌,前提是他們擁有自己的憑證。我應該實現一些機制(例如:數據庫)來跟蹤用戶擁有的令牌嗎?這似乎破壞了JWT的目的,並增加了複雜性,如果在驗證/生成令牌時必須進行額外的數據庫查詢。

8-我是否必須擔心撤銷令牌?有些人認爲擁有短的到期時間就足夠了。其他人指出,如果用戶退出應用程序後不撤銷令牌,則永遠不會擁有真正的註銷機制。等待令牌過期是否是錯誤的?就安全性而言,我何時需要撤銷令牌?

對不起,很長的文章。我一直在擔心處理這些問題的最佳方法。我感謝任何幫助。謝謝

+1

我勸你打出這些在不同的問題:1)的人更容易回答簡短的問題B)這將是爲別人尋找相同的答案,以一個具體的問題C的有用),這將使它更獨立於您的系統實施/問題。 –

回答

3

1-是否足夠使用JWT作爲我的 API的唯一身份驗證機制?

一般來說,只要「簽名密鑰」具有足夠的強度(128位,由CSPRNG生成)。我會在下面的其他答案中介紹它是否「足夠」。

2-就安全性而言,使用HMAC 的JWT與使用RSA的JWT之間是否存在差異?

一般用HMAC去,因爲他們主要的長度要短得多,因爲沒有必要讓客戶有機會獲得公共密鑰,就好象他們將通過您的TLS提供的公共密鑰基礎設施進行身份驗證服務器/ SSL證書。

3-理想情況下,我應該在哪裏存儲對稱簽名密鑰,我 用我的令牌簽名?目前,我將密鑰直接傳遞給生成我的令牌的函數 。這樣做安全嗎?

您應該將其存儲在通過網絡無法讀取的應用程序配置文件中。這使得它在每個部署中都有所不同(例如,預發佈環境中提供的令牌不能用於生產環境中的身份驗證)。

4-我是否應該定期更改簽名密鑰以獲得更好的安全性?

不,如果它具有足夠的強度(128位熵,如上),而不是如果它沒有泄漏。

5-我可以信任我插入令牌的用戶ID聲明到 是否標識發出請求的用戶?

是的,就是這一點。如果你的HMAC是通過這個索賠來計算的,那麼它是不能改變的。

6-是否有令牌的「理想」到期時間?有些人建議短至15分鐘,而另外一些人則說3小時沒事。

這取決於應用程序的「風險偏好」。例如,如果您的應用程序符合PCI規範,則這將是15分鐘。如果您對用戶長時間開放會話感到高興,那麼這可以增加。

7-我應該擔心限制特定用戶可以擁有的令牌數量嗎?用戶可能有多個移動設備,並且任何時候都可能有多個令牌。在這種情況下,沒有什麼 可以阻止用戶從我的服務器 獲取數千令牌,前提是他們擁有自己的憑證。我應該實施一些 機制(例如:數據庫)來跟蹤用戶擁有的令牌嗎? 這似乎破壞了智威湯遜的目的,並增加了複雜性,如果我有 在驗證/生成令牌時進行額外的數據庫查詢。

不,你說這首先擊敗了智威湯遜的對象。如果您允許用戶會話通過JWT進行客戶端管理,那麼您不應該跟蹤服務器端的會話。由於令牌是客戶端,因此您的應用程序無需擔心已生成了多少個,因爲沒有額外的開銷。如果您擔心多個用戶使用同一個帳戶登錄,那麼JWT並不是一種可行的方式 - 服務器端託管系統會更好,只能將發佈的令牌限制在多個同時進行的會話中。

8難道我擔心撤銷令牌?一些人建議有足夠的 令牌具有短的到期時間。其他人指出 ,你也不可能有真正的退出機制,如果不撤銷 令牌,一旦用戶退出應用程序。是否錯誤 等待令牌過期?在安全性方面,我什麼時候會有 需要吊銷令牌?

同樣,這可以歸結爲 「風險偏好」。如果密碼被破壞,撤銷攻擊者可能已經存在的現有會話將更加困難。與註銷鏈接類似,您所能做的只是響應客戶端請求刪除Cookie。

一種方法是包括在智威湯遜,其中包括在HMAC計算中的最後密碼更改的日期和時間。然後這將檢查每個請求,以確定它是否與您的數據庫中的值匹配。如果沒有,那麼你會拒絕認證令牌並強制用戶重新登錄。這是您可以通過智威湯遜撤銷的一種方法。

退出是棘手的,如果你包括在該令牌的「註銷日期/時間」一個註銷請求將註銷所有會話,這是檢查服務器端。同樣,您的風險偏好會決定這是否值得實施,或者設置一個短期限是否更容易,以便攻擊者檢索到的任何令牌可能會無限期地續約(或者直到用戶更改了密碼去我的更早的解決方案)。

+0

非常感謝SilverlightFox。你的回答非常有幫助。 –