2012-07-06 59 views
22

接受的答案在這裏爲why OAuth2 access tokens expire移動應用程序的OAuth2訪問令牌是否必須過期?

  • 許多供應商支持承載令牌,這是非常脆弱的安全性,明智的。通過使它們短暫並需要刷新,它們限制了攻擊者濫用盜取令牌的時間。 (這是什麼意思?我的意思是允許傳輸沒有TLS?別的?)。
  • 大規模部署不希望每個API調用都執行一次數據庫查找,因此它們會發出可以通過解密進行驗證的自編碼訪問令牌。但是,這也意味着無法撤銷這些令牌,因此它們會在短時間內發佈並且必須刷新。
  • 刷新令牌需要客戶端身份驗證,這使其更加強大。與上述訪問令牌不同,它通常是通過數據庫查找來實現的。

假設我們不支持訪問令牌的非加密傳輸來處理第一個項目符號點。

假設我們是用細做一個數據庫查詢對一個revokable,完全隨機的訪問令牌需要第二個照顧。

對於移動應用程序,客戶端認證不能更強,因爲「註冊期間獲得的client_id和client_secret嵌入到應用程序的源代碼中,在這種情況下,client_secret顯然不被視爲祕密。 (Google)。這消除了第三個問題。

那麼,什麼是在這種情況下分離短暫的訪問令牌和長壽命刷新令牌有什麼好處?僅僅發佈非過期訪問令牌並忽略整個刷新令牌部分是否「可以」?

回答

30

刷新令牌和安全的裝置的非過期的訪問令牌之間的差是到授權服務器一個額外呼叫。

如果攻擊者可以訪問您的未過期的訪問令牌,他可以直接調用您的資源服務器並獲取機密數據作爲響應。
現在,如果他盜取了你的刷新標記,他首先必須調用授權服務器並接收訪問令牌作爲響應。然後他可以查詢資源服務器的機密數據。

每次使用刷新令牌從授權服務器請求訪問令牌時,如果可能,OAuth 2規範(至少是現在的最新草稿)要求服務器爲check the client identity and if it is bound to the token

由於具有客戶機密的常規方法無法在開放平臺上明確標識已安裝的應用程序,運行該應用程序的平臺必須提供執行此操作的方法。 Google例如要求開發人員簽署Android應用程序。當使用Google API Console請求安卓應用程序的憑證時,您必須指定the fingerprint of the certificate you used for signing the application,並且只能獲取客戶端ID,但不會迴應。在發放令牌時,Google可以決定是否由開發者授權應用程序以他的名義申請令牌。

如果您明確無法驗證客戶端身份,則至少有可能在某些情況下識別刷新令牌被盜。該規範有一個example for this

當客戶端身份驗證不可能時,授權服務器應該部署其他手段來檢測刷新令牌濫用。

例如,授權服務器可以採用刷新令牌輪換,其中隨每個訪問令牌刷新響應一起發佈新的刷新令牌。之前的刷新令牌無效,但由授權服務器保留。如果刷新令牌受到攻擊並被攻擊者和合法客戶端使用,則其中一個會顯示一個無效的刷新令牌,該令牌會向授權服務器通知違規情況。

+0

「在發放代幣後,Google可以決定是否由開發者授權應用程序以他的名義申請代幣。」他們如何做到這一點? Android操作系統是否位於應用程序和網絡之間,是否證明應用程序已正確簽名? – Thilo 2012-07-19 04:53:03

+2

在Android上,您可以使用['AccountManager'](https://developer.android.com/reference/android/accounts/AccountManager.html)類來處理令牌和授權,Google的服務已經內置在那裏。我不認爲他們已經在使用應用程序簽名檢查,而是使用客戶端憑證方法。簽名檢查是在[Yaniv Inbar的Google I/O 2012談話](http://www.youtube.com/watch?v=dylFNrvZ_3U)中公佈的,有趣的部分是[10:41](http:///www.youtube.com/watch?v=dylFNrvZ_3U&hd=1&t=10m41s)。 – 2012-07-19 10:24:47

+0

該項目名爲[Google Play服務](https://developers.google.com/android/google-play-services/)。 – 2012-07-19 10:28:54

2

與非到期的訪問令牌的最大的問題是,有沒有一種機制,以取代被盜的令牌。如果我可以訪問您的非過期訪問令牌,那麼我對於該系統來說是有效的。如果令牌是短命的並且過期,那麼有一種機制可以替換被盜的令牌和我必須破解令牌的窗口限制。

假設我花3個小時破解一個數據包並獲得令牌,但該訪問令牌只有兩個小時好。然後,當我無法進入您的賬戶時,令牌已經改變,我必須重新開始。如果令牌沒有過期,那麼我可以完全訪問您的帳戶,並且在刪除令牌和強制重新授權之後無法取代它。

+3

但是這個問題不適用於刷新令牌,它以與訪問令牌相同的方式發佈,存儲和使用,並且不會很快過期?那麼額外的安全性在哪裏呢?這種長期存在的刷新令牌是否完全破壞了訪問令牌短暫的好處? – Thilo 2012-07-14 00:08:23

+2

刷新標記僅用於獲取新的訪問令牌,因此曝光較少。刷新令牌僅在SSL加密消息的主體中發送,而不在頭中。而刷新令牌還需要client_id和client_secret進行其他驗證。因此,刷新令牌泄露的風險比訪問令牌的風險要小。 – 2012-07-14 14:48:16

+0

在這個問題中,我已經假設只使用SSL。此外,client_id和client_secret是移動設備流程中的公共信息。在這種情況下,我真的無法看到刷新令牌如何比訪問令牌更安全地泄漏(除了可能每三十分鐘而不是每三十秒使用一次)。 – Thilo 2012-07-15 00:27:57

-1

OAuth2訪問令牌不必過期(或者確實如此,但可能需要很多年)。

訪問令牌可以用於從資源服務器獲取某些資源,特別是它允許獲取用戶批准的資源。刷新令牌另一方面允許重複訪問。因此,人們不能廢除刷新令牌,而不需要每次訪問之間的用戶交互。

一般來說,令牌有時可能被相同設備上的其他惡意應用程序或手機上的MITM攻擊所盜用。如果可以讓手機信任狡猾的證書,SSL就可以使用MITM。公司有時需要訪問內部網絡(他們要求接受一個自簽名證書,這允許他們通過公司網絡發生MITM所有加密流量,因此假設發送令牌加密意味着他們不會在途中被盜。危險的,

無限制令牌本身並不弱於任何其他形式的令牌本質,如一堆論文(包括我自己的一篇文章中所證明的那樣,當我可以將其挖掘出來時,我會發布該鏈接)。然而,無記名代幣只適用於他們所作的假設是有效的假設,令牌可以保密是一般承載代幣的主要假設,如果不是這樣,則承載令牌不會聲明任何安全屬性(儘管有些仍然成立),見NIST Level 3 tokens,它定義了持票人令牌必須擊敗什麼攻擊,如s在OAuth Bearer Tokens中特化。短承載令牌不應該打敗令牌的盜竊行爲。

無法撤銷無記名令牌,這是真的。然而,鑑於通常的訪問模式是在獲取後立即使用訪問令牌,因此即使當前無法考慮濫用案例,也應儘快終止訪問令牌以防止潛在的濫用。令牌越長,它被盜的可能性就越大。刷新令牌實際上更加危險,因爲如果您無法保護客戶端ID,它會在更長的時間框架內提供重複訪問。一般而言,OAuth2可以提供對資源的訪問,因此可以用於向客戶端公開一段時間的API。使用刷新令牌可以完成更多的損害,而不是單個使用令牌。

客戶端身份驗證實際上可以通過多種方式更安全,例如,爲每個客戶端下載不同的密鑰。這可以防止在一臺設備上對令牌進行反向工程設計,破壞客戶端所有實例的安全性的廣泛攻擊。其他潛在的技術包括使用OAuth驗證客戶端與您的服務器,然後使用您希望訪問的授權服務器執行第二次OAuth協議運行。然後,您可以讓客戶定期更新密鑰,併爲他們提供不同的密鑰,同時不會給Facebook或Google所擁有的授權服務器所使用的系統帶來不必要的負擔。

使用移動應用程序時,即使沒有采取措施來保護客戶端,長壽命刷新令牌也比擁有某種多用途持票者令牌更安全。這是因爲用戶不能過期令牌。如果刷新令牌沒有被盜用,並且用戶僅僅希望撤銷訪問,那麼這可以完成。即使用戶僅希望撤銷訪問權限,也不能撤消多用途持票人令牌。一個多用途的數據庫引用令牌顯然可以被撤消,但這不是該協議的設計目的,因此在OAuth上執行的安全分析並沒有說明這個混合系統的安全性。

總之,我會建議使用刷新令牌和數據庫令牌,因爲這是最可能安全的。如果你能做任何事情來保護客戶,這是一個獎金,但這種保護的情況是微乎其微的。如果你確實想要保護客戶端的話,可以考慮使用軟標記,一個la google authenticator,因爲這是一個堅實的實現,經得起一些非常聰明的人的分析。

+0

「訪問令牌可以一次性使用」:您有鏈接嗎?我的理解是,它可以無限次地使用,直到它到期。 – Thilo 2012-07-19 23:21:58

+0

「無法撤銷無記名令牌,這是真的。」:爲什麼?如果令牌由數據庫中的條目支持,則可以刪除該條目。 – Thilo 2012-07-19 23:23:55

+0

根據定義,不記名令牌包含從資源服務器訪問資源所需的所有信息,而不必檢查數據庫。這是一個不記名令牌的重點,它就像一張鈔票,僅僅擁有就沒有進一步的身份驗證就足夠了。如果您正在檢查數據庫,則不再是不記名令牌。訪問令牌可以使用一次的事實可以從它包含一個隨機數或一次性值的事實中獲得。目前的一些實現不檢查這一點,但從技術上講,它們不符合規範。 – jhoyla 2012-07-20 08:40:25

相關問題