2016-02-02 102 views
1

我知道智威湯遜是安全的。但只是想知道一些我無法理解的概念。JWT與RS256是否安全?

假設認證服務器「A」將簽署的令牌發送給應用服務器。如果我沒有錯簽署是通過服務器「A」上的私鑰完成的。現在,App服務器可以解密令牌並使用公鑰驗證信息。我也讀JWT是自包含的,它擁有數據和簽名。

我看到的一些示例在驗證時不使用任何安全密鑰。如果我沒有錯,RS256不需要任何特定的密鑰,我認爲它會使用公共證書來解密。

我的查詢是,如果JWT是自包含的,爲什麼不能改變數據之間的數據。

例如,假設服務器「A」發送以下信息

header.user1email.signature 

如果黑客替換數據

header.user2email.signature 

用自己的私鑰對,怎麼來的,可能是一個有效的數據嗎?如何確定它來自服務器「A」?

我知道我錯過了一些基礎知識,請幫忙嗎?

+0

嗨@CreativeManix - 我的答案是否解決了您的問題?如果是這樣,你會關心關閉這個問題嗎? – Juxhin

回答

1

JWT令牌由三個對象構成,並通過基於散列的SHA256消息認證碼(AKA HMACSHA256)方式如下:

HEADER - 包含算法和令牌的類型(通常JWT

{ 
    "alg": "HS256", 
    "typ": "JWT" 
} 

PAYLOAD - 傳遞的實際數據,所述是無狀態/自包含部分

{ 
    "name": "John Doe" 
} 

最後,您SECRET弄成這個樣子(從jwt.io拉)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. 
eyJuYW1lIjoiSm9obiBEb2UifQ. 
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds 

很酷的事情是,現在,您的應用程序並不需要與它的後端數據庫進行交互,每次它需要的信息,而不是它可以將其從JWT令牌中拉出。無論如何,只要祕密或有效載荷被篡改,簽名就會失效。

這是因爲令牌是通常被簽名和加密的方式需要您擁有私鑰(SECRET)才能真正對其進行解碼。

編輯:通過搜索後,我遇到了Misch提供的一個可愛的example。我鼓勵你閱讀它!

+0

我知道它不能被篡改,但可以用新數據替換,包括爲新數據權利計算的哈希(使用黑客自己的私鑰)?我的疑問是,我們如何確信它來自我們所期望的位置,而不是在我們的最後一個祕密密鑰? – CreativeManix

+0

@CreativeManix - 我在答案中鏈接的示例解釋了您的問題 - http://stackoverflow.com/questions/27301557/if-you-can-decode-jwt-how-are-they-secure JWT只能在兩個實體之間成功交換(自願)。試圖以任何方式篡改或改變密鑰的第三方實體將無法做到這一點。 這也造成了另一個問題。由於這是無狀態,用戶如何更改有效負載值(例如他的配置文件名稱)?如果它真的是無狀態的,你如何登錄一個用戶? – Juxhin

+0

謝謝,是的,我在提出這個問題之前看到了提供的SO鏈接,但是我仍然不清楚。在例子中「......他們都知道一些共享的祕密......」。當發送者和接收者共享密鑰時,我很清楚。因爲智威湯遜是獨立的,所以我看到了一些沒有共享密鑰的例子。例如:Azure b2c。在這些情況下,它將如何驗證? – CreativeManix