JWS 登录 java 和 typescript 不会产生相同的结果

Raj*_*ran 0 java deflate typescript pako raw

我正在尝试使用 Deflater.class 对 Java 中的 JSON 字符串进行原始压缩。但是java和typescript生成的压缩结果有一些区别。

let bodyString = JSON.stringify(idTokenPayload);
const fields = deflate ? { zip: 'DEF' } : {};
const body = deflate ? pako.deflateRaw(bodyString) : bodyString;
Run Code Online (Sandbox Code Playgroud)

在爪哇,

protected String deflateAndBase64Encode(String jsonString) {
        try {

            ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
            Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
            DeflaterOutputStream deflaterStream = new DeflaterOutputStream(bytesOut, deflater);
            deflaterStream.write(jsonString.getBytes());
            deflaterStream.finish();
            
            return Base64.getEncoder().encodeToString(bytesOut.toByteArray());
        } catch (IOException e) {
        }
        return "";
    }
Run Code Online (Sandbox Code Playgroud)

更新:

我需要按如下方式转换 JSON 有效负载以生成智能健康卡。Json Payload -> Minified JSON -> Raw deflate -> 使用 ES256 alg 进行 JWS 签名 目前,这些示例仅在 javascript 中可用,运行良好。但是 java 应用程序中生成的任何内容在验证程序应用程序中都会失败。

async signJws(idTokenPayload: Record<string, unknown>, deflate = true): Promise<string> {
    let bodyString = JSON.stringify(idTokenPayload);
    const fields = deflate ? { zip: 'DEF' } : {};
    const body = deflate ? pako.deflateRaw(bodyString) : bodyString;

    let b64 = Buffer.from(body).toString('base64');
    const signed = await jose.JWS.createSign({ format: 'compact', fields }, this.signingKey)
      .update(Buffer.from(body))
      .final();
    return (signed as unknown) as string;
  }
}
Run Code Online (Sandbox Code Playgroud)

在爪哇,

private String signPayload(String deflatedString, int index) {
        JwsHeaders jsHeaders = new JwsHeaders(SignatureAlgorithm.ES256);
        InputStream is = getClass().getClassLoader().getResourceAsStream("issuer.jwks.private.json");
        JsonWebKeys keySet;
        try {
            keySet = JwkUtils.readJwkSet(is);
            JsonWebKey key = keySet.getKeys().get(index);
            jsHeaders.setProperty("zip", "DEF");
            jsHeaders.setProperty("kid", key.getKeyId());
            
            JwsCompactProducer jwsJsonProducer = new JwsCompactProducer(jsHeaders, deflatedString);

            String signed = jwsJsonProducer.signWith(key);

            return signed;
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return "";
    }
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 5

这通常是按预期工作的。

有许多压缩的字节字符串会膨胀回相同的输出。两个平减器没有特定义务产生相同的输出。在某种程度上,您正在通过配置BEST_COMPRESSION.

  • 这听起来应该是一个单独的新问题。 (2认同)