2017-07-24 124 views
1

我想了解jwt簽名驗證如何工作。Android SafetyNet智威湯遜簽名驗證

這是我如何做它的時刻:與谷歌的

1) My app calls the attest api 
2) My app sends the jwt to my server 
3) My server verify the signature (third field of the jwt) using the certificate provided in the header of the jwt. 

據我所知,簽名通過散列頭和智威湯遜的有效載荷,然後在簽名創建(將其加密)私鑰。

我在第3步中做的是,我將頭+有效負載和 證書的公鑰解密,並驗證它與簽名匹配。 (當我說'我'的意思是一個庫做它)

我的問題是,如果有用戶設備上的惡意軟件,併發送到我的服務器JWT動態修改會發生什麼?惡意軟件會在頭中添加他自己的證書(由受信任的CA頒發),根據需要修改有效負載並創建簽名。

我服務器端......以及我將採取在證書中提供的公鑰有效簽名與它匹配。

這是正確的嗎?或者我在某個地方感到困惑?因爲在這種情況下,它會使這一切都變得沒有用處。我如何100%確保JWT來自谷歌?

回答

0

您確實正確掌握了這個概念。然而,你忽視的一點是,你使用的lib可能驗證從中提取公鑰的證書是有效的和'可信'證書(AKA來自可信CA)

感謝這(和就像doc指出的那樣),你需要驗證自己的證書是否已經由「attest.android.com」發佈。沒有人能夠僞造證書,使其來自此CA,因爲。

這是我至少理解的,如果我錯了,請糾正我。

+0

我接受了您的申請,因爲您先發布了它 – Johny19

1

關鍵的一點是驗證簽名證書是由受信任的證書頒發機構

任何信任的CA頒發給attest.android.com會發出假證書attest.android.com。看看他們從事不良行爲會發生什麼https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html?m=1

見谷歌的doc

驗證兼容性檢查響應

你應該採取措施,以確保兼容性檢查響應實際上從來到SafetyNet服務幷包含與您的請求數據相匹配的數據。

小心:您應該使用安全連接將整個JWS響應發送到您自己的服務器進行驗證。我們不建議您直接在您的應用中執行驗證,因爲在這種情況下,不能保證驗證邏輯本身未被修改。

按照以下步驟來驗證JWS消息的來源:

  1. 從JWS消息中提取SSL證書鏈。

  2. 驗證SSL證書鏈並使用SSL主機名匹配來驗證葉證書是否已頒發給主機名attest.android.com。

  3. 使用證書來驗證JWS消息的簽名。

  4. 檢查JWS消息的數據以確保它與原始請求中的數據相匹配。特別要確保nonce,時間戳,包名稱和SHA-256散列匹配。

第二點需要驗證證書鏈。假設它使用包含證書頒發機構的根證書的信任管理器

我檢查了Google的示例代碼OfflineVerify以確保TrustManager的存在,因爲它沒有明確說出,並且在過程中有效使用JWS驗證。它使用默認系統TrustManager,但您可以使用自定義的一個

請注意,使用JWS(Json Web簽名)而不是JWT。 JWT通常是與JWS簽署的身份驗證令牌

+0

阻止我創建假證書並使其'由attest.android.com發佈'。驗證簽名的庫會否因爲該證書中的公鑰與TrustedManager中的公鑰不匹配而失敗? – Johny19

+0

準確地說,攻擊者發出的假證書不會與存儲在您信任存儲區中的任何可信根證書籤署,因此簽名驗證過程將失敗。我檢查了它到谷歌代碼,因爲它不清楚它使用的是什麼信任庫 – pedrofb