java - 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());
解决方案
通常压缩的有效负载用于加密的 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。
推荐阅读
- python - 开路 CV 线检测
- python - 如何在 python 中读取包含 xml 的二进制文件?
- javascript - activeTab 在 Chrome 扩展程序中无法与 webRequest 一起使用
- neo4j - Neo4j:获取多个节点/关系属性的最小值/最大值
- python - Python 是否有任何等效于 R 的 $ 符号?
- c# - XAML 中的 ListView 和 GroupStyle
- asp.net-core - '在已注册的 .NET 数据提供程序列表中找不到指定的不变名称'System.Data.SqlClient'。' 在 .netCore 项目上
- python - 如何在keras中存储每个时代的操作结果(如TOPK)
- javascript - 将所有测试用例的“beforeEach”放在哪里?
- sql - 一起使用 AWK 和 PostgreSQL 的 COPY FROM PROGRAM