天天看點

JWT,JWS與JWE差別

JWT,JWS與JWE差別

原文:https://www.jianshu.com/p/50ade6f2e4fd

随着移動網際網路的興起,傳統基于session/cookie的web網站認證方式轉變為了基于OAuth2等開放授權協定的單點登入模式(SSO),相應的基于伺服器session+浏覽器cookie的Auth手段也發生了轉變,Json Web Token出現成為了目前的熱門的Token Auth機制。

Json Web Token(JWT)

JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在兩個組織之間傳遞安全可靠的資訊。

官方定義:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
JWT,JWS與JWE差別

現在網上大多數介紹JWT的文章實際介紹的都是JWS(JSON Web Signature),也往往導緻了人們對于JWT的誤解,但是JWT并不等于JWS,JWS隻是JWT的一種實作,除了JWS外,JWE(JSON Web Encryption)也是JWT的一種實作。

下面就來詳細介紹一下JWT與JWE的兩種實作方式:

JWT,JWS與JWE差別
  • JSON Web Signature(JWS)

    JSON Web Signature是一個有着簡單的統一表達形式的字元串:

    JWT,JWS與JWE差別

    頭部(Header)

    頭部用于描述關于該JWT的最基本的資訊,例如其類型以及簽名所用的算法等。

    JSON内容要經Base64 編碼生成字元串成為Header。

    載荷(PayLoad)

    payload的五個字段都是由JWT的标準所定義的。

    • 1 iss: 該JWT的簽發者
    • 2 sub: 該JWT所面向的使用者
    • 3 aud: 接收該JWT的一方
    • 4 exp(expires): 什麼時候過期,這裡是一個Unix時間戳
    • 5 iat(issued at): 在什麼時候簽發的

      後面的資訊可以按需補充,項目開發中比較常見的填一些需要的自定義資料,比如使用者id或使用者名。

      JSON内容要經Base64 編碼生成字元串成為PayLoad。

    簽名(signature)

    這個部分header與payload通過header中聲明的加密方式,使用密鑰secret進行加密,生成簽名。

    JWS的主要目的是保證了資料在傳輸過程中不被修改,驗證資料的完整性。但由于僅采用Base64對消息内容編碼,是以不保證資料的不可洩露性。是以不适合用于傳輸敏感資料。

    而且JWS還經常用于設計使用者認證和授權系統,甚至實作Web應用的單點登入(單點登入SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。)。實作原理:在任何一台服務節點上都能夠通過解析認證token判斷使用者是否有權限,并且可以通過token中攜帶的自定義資料(PayLoad)中的使用者資訊如使用者名或id,得知目前攜帶這個token請求的使用者是誰。

    如果需要可以看下我的下一篇文章介紹 基于JWT規範的JWS實作token認證過程,采用JWT庫jose4j,附springboot項目 demo源碼下載下傳

  • JSON Web Encryption(JWE)

    相對于JWS,JWE則同時保證了安全性與資料完整性。

    JWE由五部分組成:

    JWT,JWS與JWE差別
    具體生成步驟為:
    • 1 JOSE含義與JWS頭部相同。
    • 2 生成一個随機的Content Encryption Key (CEK)。
    • 3 使用RSAES-OAEP 加密算法,用公鑰加密CEK,生成JWE Encrypted Key。
    • 4 生成JWE初始化向量。
    • 5 使用AES GCM加密算法對明文部分進行加密生成密文Ciphertext,算法會随之生成一個128位的認證标記Authentication Tag。

      6.對五個部分分别進行base64編碼。

      可見,JWE的計算過程相對繁瑣,不夠輕量級,是以适合與資料傳輸而非token認證,但該協定也足夠安全可靠,用簡短字元串描述了傳輸内容,兼顧資料的安全性與完整性。

繼續閱讀