【问题标题】:Java inflate exception on raw dataJava 对原始数据进行膨胀异常
【发布时间】:2021-09-28 19:28:27
【问题描述】:

我试图在 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());

【问题讨论】:

  • 尝试Inflater decompressor = new Inflater(true);(将 nowrap 参数设置为 true 以解压缩原始(无标题)数据。这应该等于 tò inflateRaw`
  • 我的 base64 解码器说字符串是“无效输入”
  • @g00se 这是base64url编码的数据
  • >@g00se 这是 base64url 编码的数据
  • 有趣的是,我制作了自己的有效载荷并使用 gzip 对其进行压缩。然后我用你的代码试了一下,结果倒了。虽然我使用GZIPInputStream 时没问题

标签: java jwt compression deflate inflate


【解决方案1】:

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

如果是java.util.zip.Inflater,用

初始化充气机
Inflater decompressor = new Inflater(true);

正在将nowrap 参数设置为 true 以在原始模式(无标头)数据下解压缩,
相当于在 Node.js 中使用 inflateRaw

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

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

【讨论】:

    【解决方案2】:

    关于nowrap 的事情我认为是正确的,但尽管如此,在我修复了损坏的输入(如上所述)并执行此操作之前,我无法让您的代码正常工作:

    import java.util.Base64;
    import java.util.zip.GZIPInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    
    public class Decomp2 {
    
        public static byte[] gunzip(byte[] value) throws IOException {
            byte[] result = null;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numRead = -1;
            try (GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(value))) {
                while ((numRead = in.read(buf)) > -1) {
                    out.write(buf, 0, numRead);
                }
                result = out.toByteArray();
            }
            return result;
        }
    
        public static void main(String[] args) throws Exception {
    
            // Data gzipped and b64url-encoded
            String payload = "H4sIAKow-GAAA-1Ty27bMBC89zO2Vz1ItXZg3dokQIICRQC7CYrCB5paWwxIUSApoW6gf--StgG3SPwFAXRZcnZ2Zqh9gVFC_QJh3yPUv6ANofd1WXojXGhR6NAWUrjGf5R2VA1fQHYBcyjyWFzEKWOGTv0RQdkO1hlIhw12QQm9HDbPKEOUtG2Ve0TnI6aGzwUrOJHG069D12iMGIfeDk7iKsmH40V2tAPSak1skSEDGuD25JGYB61_OE2AU3_NCHAqXiF-IKnUT6BOGDyQCKM08cFy9WV1Szc7NWIXM3y6u19--wnriZxtFFm_ESGS8MWC5ewTfTBN2asy-GUZ9-e5ZeCDCINPPk2vMWBMfRRSqg6vbZMYpG1Ut0uK_d4HNASPD0Pv0uqrwrpdGSMtvWpKOf4mApk6oWJXMK2nDPqj9yRniw67qO08ughCt7XOoEuThAzWxYZG-V6LmNL14_KhFc4IuSf3lIyVcnCJLMazUuYwtOI5m-fVnIRoG74PZhM5gb8ZWfUe2SGy2X-RsZjZeqLcQAnSwufVjM1njHP6izfbfw-U90eXaWNV4LnoVSFHf1pca84XuRx5mdZ8-vAX5R6TWUMEAAA=";
            byte[] byt = Base64.getUrlDecoder().decode(payload.getBytes("UTF-8"));
            byte[] b = gunzip(byt);
            String s = new String(b, StandardCharsets.UTF_8);
            System.out.println(s);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多