首页 > 解决方案 > Java 对原始数据进行膨胀异常

问题描述

我试图在 java 中解码 JWT 有效负载,但这个有效负载是压缩/放气的

"zip": "DEF"

java.util.zip.DataFormatException:不正确的标头检查

private static byte[] decompress(byte[] value) throws DataFormatException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream(value.length);
        Inflater decompressor = new Inflater();
        try {
          decompressor.setInput(value);
          final byte[] buf = new byte[1024];
          while (!decompressor.finished()) {
            int count = decompressor.inflate(buf);
            bos.write(buf, 0, count);
          }
        } finally {
          decompressor.end();
        }
        return bos.toByteArray();
      }




public static void main(String[] args) throws Exception {
        
        
        String payload = "7VPbjtMwEP2X4TUXO9CumjdYkFghoZVaFiHUB9eZNka-RLYTUVb5d8ZuKxW09AuQ8jL2mTPnHGeeYZLQPkM8Dgjtd-hjHEJb18EIH3sUOvaVFL4Lr6SbVMdXUNzAnIoyFTdxypjRql8iKmdhW4D02KGNSuj1uPuBMiZJ-175J_QhYVp4U7GKE2k6fTfaTmPCeAxu9BI3WT6cL4qzHZBOa2JLDAXQAH8kj8Q8av3FawJc-ltGgEvxAvEjSaV-Allh8EQijNLEB-vN280HujmoCW3K8OvHh_Wnb7CdydlOkfX3IiYSvlqxkr2mD-a5eFEGvy3j4Tq3AkIUcQzZpxk0RkypT0JKZfHedZlBuk7ZQ1YcjiGiIXh6GHqXXt9Vzh_qFGkdVFfL6ScRyNwJDbuDeTsXMJy9Zzl79GiTtuvoEgj93nmDPk8SMjqfGjoVBi1SSvdP68deeCPkkdxTMk7K0WeyFM9GmdPQhpdsWTZLEqJd_DyaXeIE_s_Imv-RnSJb_BUZS5ltZ8oNlCAtfNks2HLBOKe_eLf_80CFcHaZN1ZFXopBVXIKl8V15nqR64nXec3n3w";
       
         byte[] byt = Base64.getUrlDecoder().decode(new String(payload).getBytes("UTF-8"));
        
        byte[] b =  decompress(byt);
        String s = new String(b, StandardCharsets.UTF_8);
    }

其他编程语言的其他人能够使用它来破解这个,想知道我将如何在 java 中完成这个?

const decompressedCard = zlib.inflateRawSync(decodedPayload);
const card = JSON.parse(decompressedCard.toString());

标签: javajwtcompressiondeflateinflate

解决方案


通常压缩的有效负载用于加密的 JWT (JWE),但SMART 健康卡也在签名令牌 (JWS) 中使用它。在这两种情况下,都使用RFC1951中定义的 DEFLATE 格式。对于 Zlib(如问题底部的示例所示),您必须使用deflateRaw/ inflateRaw(DEFLATE 没有任何 Zlib 或 gz 标头)。

在 的情况下java.util.zip.Inflater,初始化充气机

Inflater decompressor = new Inflater(true);

是将nowrap参数设置为true以原始模式(不带header)数据解压,
相当于inflateRaw在Node.js中使用。

(另见https://docs.oracle.com/javase/7/docs/api/java/util/zip/Inflater.html

使用此设置,问题中的代码可以正常工作,并且可以将给定的示例数据膨胀为 JSON。


推荐阅读