JOSE、JWA、JWE、JWK、JWS 和 JWT 之间有什么区别,它们之间如何相互关联?
JWE(JSON Web Encryption)使用基于JSON的数据结构表示加密内容。 JWE 用于在各方之间共享数据,具有认证(确保数据来自它声称的发送者),机密性(确保只有接收方可以解密数据)和完整性(确保在传输过程中未被第三方更改)。JWE 支持对称密钥加密(使用单个密钥加密和解密)和非对称密钥加密(使用公钥加密,私钥解密)。
JWS(JSON Web Signature)使用基于JSON的数据结构表示使用数字签名或消息认证码(MAC)保护的内容。 JWS 用于在各方之间共享数据,具有认证和完整性。JWS 提供了一个较轻量级的替代方案,当不需要机密性时。 JWS 支持对称密钥MAC(使用单个密钥进行签名和验证)和非对称密钥数字签名(使用私钥签名,使用公钥验证)。
JWE加密和JWS签名使用密码算法进行。这些算法及其对应的标识符在JWA(JSON Web Algorithms)中定义。
JWA中指定的密码算法以密码密钥作为输入。JWK(JSON Web Key)定义了使用基于JSON的数据结构表示密码密钥的方法。
JWT(JSON Web Token)是一种简洁、URL安全的方式,用于表示有关主体的声明,以便在两个参与方之间传输。JWT是基于声明的身份验证中使用的一种形式的基于声明的身份。可以通过JWE或JWS可选地保护JWT。 JWT的最小表示形式包括一个JOSE头部和声明(在JWS上下文中也称为有效负载,在JWE上下文中称为明文)。
这里有三个针对声明{"foo": "bar"}
的JWT值:
未受保护(无签名/加密):
{"alg": "none"}
eyJhbGciOiJub25lIn0.eyJmb28iOiJiYXIifQ
(头部 + "."
+ 声明)通过JWS
保护:
HS256
(使用SHA-256的HMAC){"kty":"oct","k":"AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8"}
{"alg":"HS256"}
eyJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.QqnxrmVYNzUZe2xJeSZIBMoELSfxW144gSAvdBTeXCo
(header + "."
+ payload + "."
+ signature)通过JWE
保护:
dir
(直接加密)A256GCM
(使用256位密钥的AES GCM){"kty":"oct","k":"AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8"}
{"alg":"dir","enc":"A256GCM"}
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..69fkCssY6yzSKVtt.3kRb3CHlZdwB1kBrwQ.mkwzT_wBpi6W7mXgjbxmvw
(header + ".."
+ initialization vector + "."
+ ciphertext + "."
+ authentication tag)注意:在JWE示例中使用了单词"possible",因为IV(初始化向量)是随机生成的。因此,使用相同密钥加密的相同JWT声明的许多有效变体可以使用JWE加密。