【问题标题】:jose4j, decrypt JWE with symmetric keyjose4j,用对称密钥解密 JWE
【发布时间】:2021-08-27 16:12:20
【问题描述】:

我正在尝试重现从 jwt.io 开始的 JWE 解码作为示例,并使用库 jose4j 转换为代码

从网站 jwt.io 我有以下内容:

标题:

{
   "alg": "HS256"
}

有效负载:

{
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
}

验证签名:

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    Fdh9u8rINxfivbrianbbVT1u232VQBZYKx1HGAGPt2I
) 

秘密 base64 未编码。

现在我尝试使用 jose4j 重现这种情况,然后在编码字段上具有相同的值,即:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.jOJ7G4oijaDk9Tr4ntAXczd6PlI4oVvBU0_5cf7oaz4

然后:

    Key key = new HmacKey("Fdh9u8rINxfivbrianbbVT1u232VQBZYKx1HGAGPt2I".getBytes(StandardCharsets.UTF_8));  
    JsonWebEncryption jwe = new JsonWebEncryption();
    String payload = Json.createObjectBuilder()
            .add("sub", "1234567890")
            .add("name", "John Doe")
            .add("iat", "1516239022")
            .build()
            .toString();
    jwe.setPayload(payload);
    jwe.setHeader("alg", "HS256");
    jwe.setKey(key);
    String serializedJwe = jwe.getCompactSerialization();
    System.out.println("Serialized Encrypted JWE: " + serializedJwe);

但是我得到了这个错误:

org.jose4j.lang.InvalidAlgorithmException: HS256 是未知的、不受支持或不可用的算法(不是 [RSA1_5、RSA-OAEP、RSA-OAEP-256、dir、A128KW、A192KW、A256KW、ECDH-ES、 ECDH-ES+A128KW、ECDH-ES+A192KW、ECDH-ES+A256KW、PBES2-HS256+A128KW、PBES2-HS384+A192KW、PBES2-HS512+A256KW、A128GCMKW、A192GCMKW、A256GCMKW])。

【问题讨论】:

  • 我不确定我是否真的了解您想要做什么,但我也认为您在这里混淆了一些东西。 JWT 基本上有两种变体,更常见的签名 JWT (JWS) 和加密变体 (JWE)。 JWT.io 只能处理已签名的令牌(标头和有效负载仅使用 base64url 编码)。因此,使用您的 JWE 代码,您无法复制您在 jwt.io 上看到的内容。 JWE 具有真正加密的有效负载。 HS256 是一种签名算法,可用于签名令牌,但不适用于 JWE。阅读medium.facilelogin.com/…的简短介绍

标签: jwt jose4j


【解决方案1】:

HS256 是一种 JWS 算法,因此您需要使用 JsonWebSignature 而不是 JsonWebEncryption 来完成您想要执行的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2016-05-21
    相关资源
    最近更新 更多