package xiaozhi.common.utils;
|
|
import org.apache.commons.lang3.StringUtils;
|
import xiaozhi.common.constant.Constant;
|
import xiaozhi.common.exception.ErrorCode;
|
import xiaozhi.common.exception.RenException;
|
import xiaozhi.modules.security.service.CaptchaService;
|
import xiaozhi.modules.sys.service.SysParamsService;
|
|
/**
|
* SM2解密和验证码验证工具类
|
* 封装了重复的SM2解密、验证码提取和验证逻辑
|
*/
|
public class Sm2DecryptUtil {
|
|
/**
|
* 验证码长度
|
*/
|
private static final int CAPTCHA_LENGTH = 5;
|
|
/**
|
* 解密SM2加密内容,提取验证码并验证
|
*
|
* @param encryptedPassword SM2加密的密码字符串
|
* @param captchaId 验证码ID
|
* @param captchaService 验证码服务
|
* @param sysParamsService 系统参数服务
|
* @return 解密后的实际密码
|
*/
|
public static String decryptAndValidateCaptcha(String encryptedPassword, String captchaId,
|
CaptchaService captchaService, SysParamsService sysParamsService) {
|
// 获取SM2私钥
|
String privateKeyStr = sysParamsService.getValue(Constant.SM2_PRIVATE_KEY, true);
|
if (StringUtils.isBlank(privateKeyStr)) {
|
throw new RenException(ErrorCode.SM2_KEY_NOT_CONFIGURED);
|
}
|
|
// 使用SM2私钥解密密码
|
String decryptedContent;
|
try {
|
decryptedContent = SM2Utils.decrypt(privateKeyStr, encryptedPassword);
|
} catch (Exception e) {
|
throw new RenException(ErrorCode.SM2_DECRYPT_ERROR);
|
}
|
|
// 分离验证码和密码:前5位是验证码,后面是密码
|
if (decryptedContent.length() > CAPTCHA_LENGTH) {
|
String embeddedCaptcha = decryptedContent.substring(0, CAPTCHA_LENGTH);
|
String actualPassword = decryptedContent.substring(CAPTCHA_LENGTH);
|
|
boolean embeddedCaptchaValid = captchaService.validate(captchaId, embeddedCaptcha, true);
|
if (!embeddedCaptchaValid) {
|
throw new RenException(ErrorCode.SMS_CAPTCHA_ERROR);
|
}
|
|
return actualPassword;
|
} else if (decryptedContent.length() > 0) {
|
throw new RenException(ErrorCode.SMS_CAPTCHA_ERROR);
|
} else {
|
throw new RenException(ErrorCode.SM2_DECRYPT_ERROR);
|
}
|
}
|
}
|