我正在嘗試使用JWT爲我的RESTful API實現無狀態身份驗證。如果智威湯遜被盜?
AFAIK,JWT基本上是在REST調用期間作爲HTTP標頭傳遞的加密字符串。
但是如果有偷聽者看到請求並且盜取了令牌?那麼他將能夠用我的身份僞造請求?
其實這個問題適用於所有基於令牌的認證。
如何防止?像HTTPS這樣的安全通道?
我正在嘗試使用JWT爲我的RESTful API實現無狀態身份驗證。如果智威湯遜被盜?
AFAIK,JWT基本上是在REST調用期間作爲HTTP標頭傳遞的加密字符串。
但是如果有偷聽者看到請求並且盜取了令牌?那麼他將能夠用我的身份僞造請求?
其實這個問題適用於所有基於令牌的認證。
如何防止?像HTTPS這樣的安全通道?
我是一個處理身份驗證的節點庫的作者,它的處理相當深入,所以我會在這裏提供一些信息。
首先,智威湯遜通常是不是加密。雖然有一種方法可以對JWT進行加密(請參閱:JWEs),但由於許多原因,這在實踐中並不常見。
接下來,任何形式的身份驗證(使用JWTs或不),都受MitM攻擊(man-in-the-middle)攻擊。這些攻擊發生在攻擊者可以通過互聯網發出請求時查看您的網絡流量。這是您的ISP可以看到的,NSA等。
這是SSL有助於防止的方式:通過從計算機加密您的網絡流量 - >在進行身份驗證時,某些服務器正在監視網絡流量的第三方可以不要看到你的令牌,密碼或類似的東西,除非它們能夠以某種方式獲得服務器私有SSL密鑰的副本(不太可能)。這就是SSL對所有形式的認證必不可少的原因。
不過讓我們說,有人是能夠利用你的SSL,並能夠查看您的令牌:在回答你的問題是,YES,攻擊者將能夠使用該令牌來冒充你並向您的服務器發出請求。現在
,這就是協議進來。
JWTs是一個認證令牌只是一個標準。它們可以用於任何事情。 JWT有點酷的原因是你可以在其中嵌入額外的信息,並且你可以驗證沒有人與它混淆(簽名)。
然而,智威湯遜本身與'安全'無關。對於所有意圖和目的,JWT與API密鑰差不多:只是隨機字符串,用於對某個服務器進行身份驗證。
什麼讓你的問題更有趣,是使用的協議(最可能的OAuth2)。
OAuth2的工作方式是,它旨在爲客戶提供TEMPORARY標記(如JWT!)以進行短時間內的身份驗證!
這個想法是,如果您的令牌被盜,攻擊者只能在短時間內使用它。
使用OAuth2,您必須經常通過提供用戶名/密碼或API憑據來重新驗證自己的身份,然後獲取令牌作爲交換。
因爲這個過程偶爾會發生,所以你的代幣會經常變化,這讓攻擊者在不經過大麻煩的情況下不斷冒充你很難。
希望這有助於^^
自從您提到OAuth以來,有一個相關問題:如果攻擊者竊取我的oauth標記並刷新標記會怎麼樣...他們理論上可以永久訪問我的API(除非我撤消對該標記的訪問)是正確的? – pratikm
通常,刷新標記也具有設置到期(雖然它會比訪問標記更長)。但是,是的,你是對的。 – rdegges
以下文章的作者認爲,智威湯遜的一個缺點是,從失竊的智威湯遜中恢復的唯一方法是生成一個新的密鑰對並有效記錄所有用戶。而使用存儲在數據庫中的session-id,網站只能刪除受影響用戶的會話並將其從所有設備中註銷。我不確定OAuth2如何適合這裏的圖片,或者它是否有助於緩解所提出的缺點。 https://medium.com/@rahulgolwalkar/pros-and-cons-in-using-jwt-json-web-tokens-196ac6d41fb4 – Marcel
我知道這是一個老問題,但我想我可以將我的$ 0.50在這裏,可能有人可以改善或提供的參數來完全拒絕我的做法。 我通過HTTPS(ofc)在RESTful API中使用JWT。
對於這個工作,你應該總是發出短暫的令牌(取決於大多數情況下,在我的應用程序中,我實際上將exp
聲明設置爲30分鐘,而ttl
爲3天,因此您可以刷新此令牌只要其ttl
仍然有效,並且令牌一直沒有黑名單)
對於authentication service
,以無效的令牌,我喜歡用的內存緩存層(Redis的在我的情況)作爲JWT blacklist
/ban-list
在前面,具體取決於一些標準: (我知道它打破了RESTful ph ilosophy,但是存儲的文件是真的短命的,因爲我對列入黑名單的剩餘時間的生存 -
注ttl
以下的申索─):黑名單令牌不能自動刷新
user.password
或user.email
已更新(需要密碼確認),則auth服務會返回刷新的令牌並使之前的(一個或多個)黑名單失效,因此,如果您的客戶端檢測到用戶的身份已被破壞,您可以要求該用戶更改它的密碼。 如果您不想使用黑名單,您可以(但我不鼓勵您)對user.updated_at
字段(如果jwt.iat < user.updated_at
,則JWT無效)驗證iat
(發出)聲明。最後你像大家一樣正常驗證令牌。
注2:而不是使用令牌本身(這是很長)作爲高速緩存的關鍵,我認爲產生和使用UUID令牌的jti
要求。這是好的,我認爲(不確定,因爲它只是在我腦海中),您可以使用與CSRF令牌相同的UUID,方法是返回一個secure
/non-http-only
cookie,並使用js正確實現X-XSRF-TOKEN
標頭。這樣您可以避免爲CSRF檢查創建另一個令牌的計算工作。
提供您的想法永遠不會太晚。感謝您的回覆。 – smwikipedia
這就是爲什麼令牌通常只在短時間內有效。是的,如果您擔心數據的機密性,您應該使用HTTPS。 –
@JonathonReinhart但是如果一個令牌很快就會過期,我的客戶必須不時重新驗證自己,以獲得新的令牌。這是不是很乏味? – smwikipedia
@JonathonReinhart我想我明白了爲什麼令牌是短命的。因爲這樣,服務器不需要跟蹤令牌的到期時間,從而爲可擴展性騰出空間。這在'更好地控制令牌過期'和'具有更好的可擴展性'之間有一種'折衷'。 – smwikipedia