iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

Techschool Goalng Backend Master Class 的學習記錄系列 第 31

[Day 31] Why PASETO is better than JWT for token-based authentication?

  • 分享至 

  • xImage
  •  

JWT vs PASETO

  1. Token-based Authentication
  • Token-based 身份驗證在網頁和移動應用程式開發中越來越受歡迎。
  1. JWT
    • JWT 是最常用的 token 格式之一
    • 由於標準設計的缺陷,JWT 存在多個安全問題
  2. PASETO
    • PASETO 是一種新興的 token 格式,應對 JWT 的安全問題。
    • 提供更強的安全保護,減少應用程式的安全風險。
  3. 安全轉變
    • 許多開發者和組織正從 JWT 轉向使用 PASETO,以獲得更好的安全性。
  4. 標準設計
    • PASETO 的設計著重於解決 JWT 標準的缺陷,使其成為一個更可靠的身份驗證 token 選擇。

Token-based authentication

https://ithelp.ithome.com.tw/upload/images/20231018/20121746cJ1RYieFix.png

Token-Based 身份驗證是一種機制,允許客戶端通過一個由服務器生成和簽署的 access token 來訪問受保護的資源。這個機制的核心步驟包括:

  1. 客戶端登入請求

    • 客戶端發送第一個請求來登入用戶,提供用戶名和密碼給服務器。
    • 服務器檢查用戶名和密碼是否正確。
  2. Server response

    • 如果用戶名和密碼正確,服務器會使用其Secret或私鑰創建和簽署一個 token。
    • 服務器隨後會發送一個 200 OK 響應和簽署的 access token 給客戶端。
  3. Access Token

    • 客戶端使用 access token 來訪問服務器上的其他資源。
    • Access token 被嵌入到請求的頭部中。
  4. 訪問受保護資源

    • 當客戶端想要獲取屬於已登入用戶的銀行帳戶列表時,會發送一個帶有 access token 的 GET /accounts 請求。
    • 服務器驗證提供的 token 是否有效。
  5. Response

  • 如果 token 有效,請求將被授權,服務器會回傳一個 200 OK 響應和用戶的銀行帳戶列表。
  1. Access Token 的有效期
    • Access token 通常有一個生命週期,在這個時間內,客戶端可以使用同一個 token 向服務器發送多個請求。

JSON Web Token

https://ithelp.ithome.com.tw/upload/images/20231018/20121746C7aNUqTVN5.png

JWT 是一個 base64 編碼的字符串,由三個主要部分組成,每部分之間用點分隔:

  1. Header (紅色部分)
    • 包含 token 的類型(JWT)和用於簽署 token 的算法(例如,HS256)。
  2. Payload (紫色部分)
    • 存儲有關已登入用戶的資訊,如用戶名,以及 token 的過期時間戳。
    • 可自定義 JSON payload 來存儲任何其他需要的資訊。
    • 記住,JWT 中存儲的所有數據只是 base64 編碼的,不是加密的,所以不需要服務器的秘密/私鑰來解碼其內容。
  3. Digital Signature (藍色部分)
    • 服務器使用secret/ private key簽署 token,用於驗證 token 的真實性。
    • 只有服務器擁有正確的secret/private key,因此如果駭客嘗試創建假 token,將在驗證過程中被輕易檢測。

Digital Signature

  1. 對稱鑰算法 (Symmetric-key algorithm)

    https://ithelp.ithome.com.tw/upload/images/20231018/20121746ujze9YwZCu.png

    • 使用相同的秘密鑰來簽署和驗證 token。
    • 適合僅內部使用的場景,因為秘密鑰需要保密。
    • 典型算法:HS256, HS384, 和 HS512。
  2. 非對稱鑰算法(Asymmetric-key algorithm)

    https://ithelp.ithome.com.tw/upload/images/20231018/20121746cpH4CPWFaH.png

    • 有一對鑰匙,私鑰用於簽署 token,公鑰用於驗證。
    • 允許我們與任何外部第三方服務共享公鑰,而不用擔心私鑰洩露。
    • 包括 RS 組,PS 組,或 ES 組的算法。

Problems of JWT

https://ithelp.ithome.com.tw/upload/images/20231018/20121746W5Vug3bt43.png

Weak algorithms

  • JWT 提供了太多的算法選擇,其中包括一些已知存在漏洞的算法。
  • 例如,使用 PKCSv1.5 的 RSA 容易受到填充 oracle 攻擊;ECDSA 可能面臨無效曲線攻擊。
  • 對於安全經驗不足的開發者,很難知道哪個算法是最好的選擇。

Trivial Forgery

  • JWT 包含簽名算法在 token 的 header 中,使得 token 偽造變得相對容易。
  • 在過去,攻擊者可以將 alg header 設置為 none 來繞過簽名驗證過程。
  • 雖然許多庫已經識別並修復了這個問題,但這是選擇社區開發庫時需要仔細檢查的一點。

Dangerous Potential Attacks

  • 攻擊者可能故意將算法 header 設置為對稱鑰算法(例如 HS256),同時知道服務器實際上使用非對稱鑰算法(例如 RSA)來簽署和驗證 token。
    • 這種攻擊手法在資安領域中被稱為「演算法替換攻擊」或「演算法混淆攻擊」。在這種攻擊中,攻擊者會故意改變令牌(token)中的演算法聲明,以試圖繞過系統的安全機制或者利用系統的漏洞。這常常涉及到將令牌的演算法字段(如 JWT 的 "alg" 字段)更改為系統未預期或未正確驗證的值。
    • 舉例來說,在 JWT 的情境下,如果一個令牌是使用 RS256 (一種非對稱密鑰演算法)來簽名的,攻擊者可能會試圖更改令牌的 "alg" 字段為 HS256 (一種對稱密鑰演算法),然後使用公開密鑰來簽名這個令牌。因為 HS256 和 RS256 使用的密鑰格式是相容的,所以這可能允許攻擊者創建一個具有任意內容的有效令牌。
    • 公鑰是公開的:因為 RSA 是一種非對稱鑰算法,所以它有一對鑰匙:公鑰和私鑰。公鑰是公開的,任何人都可以取得。
    • 偽造 token:攻擊者可以使用這個公鑰來簽署一個偽造的 token,並將 token 的算法 header 故意設置為 HS256(一種對稱鑰算法)。
    • 服務器的驗證:當伺服器收到這個 token 時,它會查看算法 header,並嘗試使用 HS256 算法和公鑰來驗證 token。因為 HS256 是對稱鑰算法,所以用來簽署和驗證 token 的是相同的鑰匙。
    • 攻擊成功:由於攻擊者使用公鑰簽署了 token,而伺服器也使用公鑰來驗證 token,所以驗證會成功,攻擊者就可以使用這個偽造的 token 來訪問受保護的資源。
  • 這樣,攻擊者可以用服務器的公鑰來簽署偽造的 token,然後用這個偽造的 token 來訪問服務器上的資源。
  • 因此在伺服器代碼中,必須檢查 token 的算法 header,確保它與伺服器用來簽署和驗證 token 的算法匹配。

PASETO - Platform Agnostic Security Token

PASETO (Platform Agnostic Security Token) 是一種被廣泛接受的 JWT (JSON Web Token) 的最佳安全替代方案。

https://ithelp.ithome.com.tw/upload/images/20231018/20121746hnYLH749K9.png

Strong algorithms

  • PASETO 提供開箱即用的強簽名演算法,開發者不需要選擇演算法,只需要選擇 PASETO 的版本。
  • 每個 PASETO 版本都已經使用一個強密碼套件實現。
  • 最多只有兩個 PASETO 的最新版本是活躍的。

PASETO version 1

  • 適用於無法使用現代密碼學的遺留系統。
  • 對於本地或內部服務,我們使用對稱鑰演算法。
  • PASETO 使用 Authenticated Encryption with Associated Data (AEAD) 演算法加密和驗證 token 中的所有數據。
  • 公開場合使用非對稱鑰演算法,與 JWT 類似,不加密 token 數據,但使用私鑰與數位簽名簽署內容。

PASETO version 2

  • 使用更安全和現代的演算法。
  • 本地對稱鑰情境使用 XChacha20 與 Poly1305 演算法。
  • 公開非對稱鑰情境使用 Edward-curve 數位簽名演算法與curve 25519

Non-trivial forgery

  • PASETO 的設計使 token 偽造不再簡單。
  • 因為演算法 header 不存在,所以攻擊者不能將其設置為 none,也不能強制伺服器使用 header 中選擇的演算法。
  • token 中的所有內容都用 AEAD 驗證,所以不可能篡改它。
  • 使用本地對稱鑰演算法,payload 現在被加密,不僅僅是編碼,所以如果不知道伺服器的秘密鑰匙,黑客就無法讀取或更改 token 中存儲的數據。

PASETO Structure

https://ithelp.ithome.com.tw/upload/images/20231018/201217467HSUXajNFn.png

  • PASETO 令牌由四個主要部分組成,用點分隔。
  • 包括 PASETO 版本、令牌的用途(LocalPublic)、主要內容或 payload 數據(加密)和令牌的 footer(可選)。
    • Local → Symmetric-key
    • PublicAsymmetric-key
  • Footer 中可以存儲任何公開信息,因為它不會像 payload body 一樣被加密,只是被 base64 編碼。
  • 當使用Public時且其payload不會被加密,只會被 base64 編碼。
  • Payload中藍色的部分是由數位簽名演算法使用私鑰創建的令牌簽名,伺服器將使用其配對的公開密鑰來驗證此簽名的真實性。

結論

在今天的網路世界中,安全性非常重要。當我們建立一個應用程式時,我們需要確保我們的使用者資料是安全的。這就是為什麼 PASETO 比 JWT 更好。PASETO 提供了更好的安全性,避免了許多 JWT 有的漏洞,而且更容易使用。如果您正在開發一個應用程式,我建議您使用 PASETO 來確保您的使用者資料是安全的。

目前來看,我們沒有發現 PASETO 有什麼顯著的缺點。然而,由於它是一個相對較新的技術,可能還有一些未知的安全問題尚待發現。因此,我們建議開發人員在使用 PASETO 時仍需保持警覺,並定期更新其版本,以確保最大程度的安全性。


上一篇
[Day 30] How to write stronger unit tests with a custom go-mock matcher
系列文
Techschool Goalng Backend Master Class 的學習記錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言