JOSE、JWA、JWE、JWK、JWS 和 JWT 有什么区别?

Mar*_*rco 21 jwt jwe jwk jose

JOSE、JWA、JWE、JWK、JWS 和 JWT 之间有什么区别?它们之间有何关系?

Mar*_*rco 42

JOSE代表 JSON 对象签名和加密。它是一组用于使用基于 JSON 的数据结构对数据进行签名和加密的标准。换句话说,JWAJWEJWKJWSJWT都是JOSE的一部分。

长话短说:

  • JWA :定义了JWEJWKJWS中使用的一组加密算法和标识符。
  • JWK :使用基于 JSON 的数据结构定义加密密钥的表示形式,用作JWA中定义的算法的输入。
  • JWE:使用基于 JSON 的数据结构定义加密内容。加密/解密是使用JWA中定义的算法执行的。
  • JWS:使用基于 JSON 的数据结构定义签名内容。使用JWA中定义的算法执行签名/验证
  • JWT:使用基于 JSON 的数据结构定义主题声明。可以选择通过JWEJWS保护声明。

更长的版本:

JWE(JSON Web Encryption)表示使用基于 JSON 的数据结构的加密内容。JWE用于在各方之间共享数据,并具有身份验证(确保数据来自其声称的发送者)、机密性(确保只有接收者可以解密数据)和完整性(确保数据在传输过程中不被第三方更改)。JWE支持对称密钥加密(用于加密和解密的单个密钥)和非对称密钥加密(用于加密的公钥,用于解密的私钥)。

JWS(JSON Web 签名)表示使用基于 JSON 的数据结构通过数字签名或消息身份验证代码 (MAC) 保护的内容。JWS用于在各方之间共享具有身份验证完整性的数据。当不需要保密性时, JWS提供了与JWE相对应的轻量级版本。JWS支持基于对称密钥的 MAC(用于签名和验证的单个密钥)和基于非对称密钥的数字签名(用于签名的私钥,用于验证的公钥)。

JWE加密和JWS签名是使用加密算法执行的。这些算法及其相应的标识符在JWA(JSON Web 算法)中定义。

JWA中指定的加密算法使用加密密钥作为输入。JWK(JSON Web Key)使用基于 JSON 的数据结构定义加密密钥的表示形式。

JWT(JSON Web 令牌)是一种紧凑、URL 安全的方式,用于表示有关在两方之间传输的主题的声明JWT是一种用于基于声明的身份验证的基于声明的身份形式。JWT可以选择通过JWEJWS进行保护。JWT的最小表示由JOSE 标头声明(在JWS上下文中也称为有效负载,在JWE上下文中也称为明文)组成。


以下是声明的三个JWT{ "foo": "bar" }值:

不受保护(无签名/加密):

  • 最小JOSE 标头为:{ "alg": "none" }
  • JWT值为:(eyJhbGciOiJub25lIn0.eyJmb28iOiJiYXIifQ标头 + "."+ 声明)

保护通过JWS

  • 使用带有 id 的JWAHS256 :(使用 SHA-256 的 HMAC)
  • 使用JWK的值:{ "kty": "oct", "k": "AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8" }
  • 最小JOSE 标头为:{ "alg": "HS256" }
  • JWT值为:(eyJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.QqnxrmVYNzUZe2xJeSZIBMoELSfxW144gSAvdBTeXCo标头++"."有效负载++"."签名)

保护通过JWE

  • 使用密钥管理模式:(dir直接加密)
  • 使用带有 id 的JWAA256GCM :(使用 256 位密钥的 AES GCM)
  • 使用JWK的值:{ "kty": "oct", "k": "AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8" }
  • 最小JOSE 标头为:{ "alg": "dir", "enc": "A256GCM" }
  • 一个可能的JWT值是:(eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..69fkCssY6yzSKVtt.3kRb3CHlZdwB1kBrwQ.mkwzT_wBpi6W7mXgjbxmvw标头 + ".."+ 初始化向量 + "."+ 密文 + "."+ 身份验证标签)

注意:JWE示例中使用“可能”一词是因为 IV(初始化向量)是随机生成的。因此,使用相同密钥通过JWE加密的相同JWT声明有许多有效变体。