2015-06-19 45 views
1

據我瞭解JWT驗證它基本上是這樣的:當攻擊者獲得用於生成JWT的祕密時會發生什麼?

  • 用戶發送的登錄憑據到服務器
  • 如果登錄憑據是正確的,服務器發出包含的用戶ID和用戶名一智威湯遜(或任何你想要的在有效載荷,以確定
  • 是使用應用程序範圍內的祕密,這應該被存儲在環境變量
  • JWT是由用戶存儲生成此JWT用戶),例如在localStorage的和與每一個請求發送到標頭
  • 012中的服務器
  • 使用應用程序範圍的祕密驗證auth頭中的JWT。如果驗證成功,我們知道誰發送了請求,並且請求是否被授權。

但是如果攻擊者獲得訪問用於生成智威湯遜祕密的信息會發生什麼?是不是像主密碼?隨着祕密和用戶ID /用戶名,任何人都可以爲任何用戶發佈JWT,並基本上接管任何帳戶。這不是一個巨大的缺陷,因爲一小部分信息會危及整個系統(而不僅僅是一個用戶帳戶)?還是我誤會了?

+0

此頁面指示最佳實踐:https://stormpath.com/blog/jwt-the-right-way/「保護用於計算和驗證簽名的祕密簽名密鑰。祕密簽名密鑰只能由發行人和消費​​者,它們不應該在這兩方之外訪問。「jwt示例代碼有一個硬編碼的密鑰,很多人都會對他們的代碼做同樣的事情,從不評估實踐,然後一部分人將這些代碼存儲在公共存儲庫中。危險,順便說一句 –

+1

是的,當然它不應該被硬編碼,它不應該在你的回購(或在Github上爲上帝着想)......但是讓我說我​​有幾個應用程序的實例,通過啓動新實例因此我需要將祕密傳遞給我的應用程序的每個實例,這意味着我必須將祕密存儲在我的服務器上的某個地方,因爲我不打算手動啓動實例,輸入只存在於我的應用程序中的祕密現在我的問題是:如果有人能夠訪問這個祕密怎麼辦?整個應用程序基本上都是公開的,對吧? –

+0

正如我剛纔想到的那樣,讓攻擊者更難以爲每個用戶添加一個隨機的,唯一的,串到存儲在用戶信息中的JWT。任何攻擊者都可以輕鬆讀取,但只能用於當前登錄的帳戶。這樣服務器就會立即知道服務器上是否生成了JWT。不利的一面是,每一個保護API端點的請求都會影響數據庫,查詢用戶表來驗證字符串。 –

回答

1

您正在描述一種JWT受到對稱密鑰(即發送者和接收者之間共享的祕密)完整性保護的機制。這只是保護智威湯遜的一種選擇,雖然不是最安全的選擇,因爲它依賴於可能在兩端丟失或被盜的祕密。在發件人不能保密的情況下,如瀏覽器內的客戶端也沒有用。當發送者需要爲每個接收者管理一個共享密鑰的多個接收者時,它也較不易管理/可擴展。

使用公鑰/私鑰對保護智威湯遜存在更安全的選項。在這種情況下,智威湯遜將使用只有發件人知道的私鑰進行簽名,並且接收方只能知道公鑰。當然,如果這個私鑰丟失了,它將允許攻擊者生成任意的JWT並冒充用戶,但由於攻擊者顯然已經可以訪問服務器端基礎設施,他甚至不需要模擬用戶訪問服務器端信息。

所以你是對的:受共享祕密保護的JWT往往不太受歡迎,因爲它具有安全意義,但有一種更好的方法可以使用PKI機制來保護它。

2

如果你是所有這些加密的東西,我建議你閱讀Diffie-Hellman密鑰交換技術。它允許兩方在沒有先知道共同祕密的情況下進行安全對話。它利用PK加密技術,基本上是以下類比:

1)我把一個掛鎖放在一個盒子上,並將它發送給你郵寄給你。盒子裏面有一個我想讓你知道的祕密,在這種情況下是一個會話密鑰。 2)您將收到包裹並將自己的掛鎖放在箱子上,通過郵件發回給我。 3)我收到帶有兩個鎖的盒子,並取出我自己的鎖,然後將鎖僅發送給您。 4)您再次收到包裝盒,取出您的鎖並獲取內容:會話密鑰,除了我之外,其他任何人都不會看到會話密鑰。