我试图在 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), but 智能健康卡也可以在签名令牌(JWS)中使用它。在这两种情况下,DEFLATE 格式定义为RFC1951用来。对于 Zlib (如问题底部的示例所示),您必须使用deflateRaw
/inflateRaw
(DEFLATE 没有任何 Zlib 或 gz 标头)。
如果出现以下情况java.util.zip.Inflater
,初始化充气机
Inflater decompressor = new Inflater(true);
正在设置nowrap
参数为 true 以原始模式(无标头)解压缩数据,
这等于使用inflateRaw
在 Node.js 中。
(也可以看看https://docs.oracle.com/javase/7/docs/api/java/util/zip/Inflater.html)
通过此设置,问题中的代码可以正常工作,并且给定的示例数据可以扩展为 JSON。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)