Skip to content

Commit b623fa8

Browse files
authored
企业微信API回调验签错误 #3756
我找到了 WxCryptUtil.decrypt 函数,并对其进行了加固,通过在切片之前验证解密后的有效载荷长度,避免了 Arrays.copyOfRange 函数抛出的 IllegalArgumentException 异常。如果数据格式错误(通常是由于 EncodingAESKey 错误或密文损坏),现在会抛出一个清晰的 WxRuntimeException 异常,而不是像之前那样抛出“20 > …”的错误。 构建和测试: 重新构建项目并重试回调验证;现在你应该会得到解密成功的结果,或者一个清晰、可操作的错误信息,而不是 IllegalArgumentException 异常。 我在 WxCryptUtil.decrypt 函数中添加了强大的长度检查,以防止运行时崩溃,并在密钥/密文错误时提供精确的错误消息。
1 parent d4186c4 commit b623fa8

File tree

1 file changed

+12
-2
lines changed
  • weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto

1 file changed

+12
-2
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,22 @@ public String decrypt(String cipherText) {
333333
byte[] bytes = PKCS7Encoder.decode(original);
334334

335335
// 分离16位随机字符串,网络字节序和AppId
336+
if (bytes == null || bytes.length < 20) {
337+
throw new WxRuntimeException("解密后数据长度异常,可能为错误的密文或EncodingAESKey");
338+
}
336339
byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
337340

338341
int xmlLength = bytesNetworkOrder2Number(networkOrder);
339342

340-
xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
341-
fromAppid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET);
343+
// 长度边界校验,避免非法长度导致的越界/参数异常
344+
int startIndex = 20;
345+
int endIndex = startIndex + xmlLength;
346+
if (xmlLength < 0 || endIndex > bytes.length) {
347+
throw new WxRuntimeException("解密后数据格式非法:消息长度不正确,可能为错误的密文或EncodingAESKey");
348+
}
349+
350+
xmlContent = new String(Arrays.copyOfRange(bytes, startIndex, endIndex), CHARSET);
351+
fromAppid = new String(Arrays.copyOfRange(bytes, endIndex, bytes.length), CHARSET);
342352
} catch (Exception e) {
343353
throw new WxRuntimeException(e);
344354
}

0 commit comments

Comments
 (0)