1.优化查询岗位详情,查询无效岗位提示

2.优化微信授权登录,把PKCS5Padding 改成PKCS7Padding并且添加appid验证是否一致问题
This commit is contained in:
sh
2026-06-03 12:33:46 +08:00
parent 8237cb774f
commit d1eadf7f5d
3 changed files with 36 additions and 13 deletions

View File

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
@@ -20,6 +21,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.Security;
import java.util.Base64;
import java.util.Formatter;
import java.util.HashMap;
@@ -41,6 +43,13 @@ public class WechatUtil {
@Value("${wx.secret}")
private String secret;
// 全局注册一次 BC Provider避免每次解密都重复注册
static {
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
Security.addProvider(new BouncyCastleProvider());
}
}
public AppWechatEntity sign(String url) {
Map<String, String> ret = new HashMap();
String nonceStr = create_nonce_str();
@@ -291,8 +300,8 @@ public class WechatUtil {
throw new RuntimeException("iv长度错误应为16字节");
}
// 2. 初始化 AES-128-CBC 解密器使用PKCS5Padding替换PKCS7Padding两者在AES中效果一致
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// 2. 初始化 AES-128-CBC 解密器
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
SecretKeySpec keySpec = new SecretKeySpec(sessionKeyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
@@ -302,9 +311,19 @@ public class WechatUtil {
String decryptedStr = new String(decryptedBytes, StandardCharsets.UTF_8);
// 4. 解析为 JSON 并返回(包含手机号等信息)
return JSONObject.parseObject(decryptedStr);
} catch (Exception e) {
throw new RuntimeException("解密用户手机号失败:" + e.getMessage(), e);
JSONObject jsonObject=JSONObject.parseObject(decryptedStr);
// 5.验证 watermark 中的 appid 是否匹配,防止伪造数据攻击
JSONObject watermark = jsonObject.getJSONObject("watermark");
if (watermark == null || !appid.equals(watermark.getString("appid"))) {
throw new SecurityException("解密数据校验失败appid不匹配数据可能已被篡改");
}
return jsonObject;
} catch (IllegalArgumentException | SecurityException e) {
throw new RuntimeException(e.getMessage(), e);
}catch (Exception e) {
System.err.println("微信手机号解密底层异常: " + e.getMessage());
throw new RuntimeException("用户手机号解密失败,请检查登录态是否过期或参数是否正确");
}
}