当前位置: 首页 > 知识库问答 >
问题:

Java夸大原始数据的异常

万俟华辉
2023-03-14

我试图用java解码JWT负载,但是这个负载被压缩/压缩了

"zip": "DEF"

JAVAutil。拉链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());

共有2个答案

翟淮晨
2023-03-14

关于now rap的事情我认为是正确的,但是尽管如此,我还是无法让你的代码工作,直到我修复了损坏的输入(上面提到的)并做到了这一点:

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);
    }
}
荀嘉熙
2023-03-14

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

对于java。util。拉链充气机,用

Inflater decompressor = new Inflater(true);

nowrap参数设置为true,以在原始模式(无标头)数据中解压缩,这等于在Node.js.中使用膨胀Raw

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

有了这个设置,问题中的代码运行良好,给定的示例数据可以膨胀为JSON。

 类似资料:
  • 问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它

  • 一、如何导出 诸葛io可以提供未来一个月的原始数据导出(如您要导出7.1~7.30的数据,需要您在6.30之前联系我们),导出的数据为json格式,您可以联系工作人员并整理以下信息进行数据导出,导出后我们会将数据压缩并发送到指定邮箱。 应用id: 公司名称: 邮箱地址: 二、数据导出格式说明 1. 移动端数据格式 { "owner": "zg", "st": 1493895485371,

  • Navicat 通常标识用户在表输入的字符串为一般字符串,任何特殊字符或函数将被处理为纯文本(即是它的功能会被忽略)。 在“原始数据模式”编辑数据是一个方便和直接的方法来应用服务器的内置函数。若要使用原始数据模式功能,只需简单地选择“查看”->“显示”->“原始数据模式”。 【注意】仅适用于 MySQL、Oracle、PostgreSQL、SQL Server 和 MariaDB。

  • Navicat 通常标识用户在表输入的字符串为一般字符串,任何特殊字符或函数将被处理为纯文本(即是它的功能会被忽略)。 在“原始数据模式”编辑数据是一个方便和直接的方法来应用服务器的内置函数。若要使用原始数据模式功能,只需简单地选择“查看”->“显示”->“原始数据模式”。 【注意】仅适用于 MySQL、Oracle、PostgreSQL、SQL Server 和 MariaDB。

  • Navicat 通常标识用户在表输入的字符串为一般字符串,任何特殊字符或函数将被处理为纯文本(即是它的功能会被忽略)。 在“原始数据模式”编辑数据是一个方便和直接的方法来应用服务器的内置函数。若要使用原始数据模式功能,只需简单地选择“查看”->“显示”->“原始数据模式”。 【注意】仅适用于 MySQL、Oracle、PostgreSQL、SQL Server 和 MariaDB。

  • 问题:我无法存储号码“600851475143”。我意识到这个数字比int所能容纳的要大,比最大long值要小。然而,我的程序没有把变量“number”注册成一个long,而是注册成一个int。有人能解释一下这个问题吗? **-问题线 } 解决方案:正如吉姆在下面所说,为了长型,必须在数字末尾加上“L”或“L”。“如果整数文字以字母L或L结尾,则为long类型;否则为int类型。建议使用大写字母L