fix: 修复TMDB API Key解密问题

- TmdbScraperService: 添加EncryptUtil.decrypt()调用解密API Key

- 修复tmdb_api_key字段未自动解密导致API调用失败的问题
This commit is contained in:
liRQ 2026-06-26 14:52:44 +08:00
parent 6f3b6f9f28
commit 83c4e08856
22 changed files with 2104 additions and 142 deletions

View File

@ -33,20 +33,16 @@ public class EncryptUtil {
private static final String ENCRYPT_SUFFIX = ")"; private static final String ENCRYPT_SUFFIX = ")";
/** /**
* 默认加密算法 - PBEWithMD5AndDES * 默认加密算法 - Spring Jasypt 配置保持一致
* PBE = Password Based Encryption基于密码的加密 * 必须与 application.yml jasypt.encryptor.algorithm 相同
* MD5 + DES 是经典组合兼容性好
* 如需更高安全性可改为 PBEWITHSHA256AND256BITAES-CBC-BC
*/ */
private static final String DEFAULT_ALGORITHM = "PBEWithMD5AndDES"; private static final String DEFAULT_ALGORITHM = "PBEWITHHMACSHA512ANDAES_256";
/** /**
* 默认加密密钥仅用于开发环境 * 默认加密密钥 - Spring Jasypt 配置保持一致
* 生产环境必须通过环境变量覆盖此值 * 必须与 application.yml jasypt.encryptor.password 相同
* -Djasypt.encryptor.password=你的密钥
* 或设置环境变量JASYPT_ENCRYPTOR_PASSWORD=你的密钥
*/ */
private static final String DEFAULT_PASSWORD = "wangpan2024"; private static final String DEFAULT_PASSWORD = "wangpan-secret-key-2024";
// ==================== 单例实例 ==================== // ==================== 单例实例 ====================
@ -183,13 +179,14 @@ public class EncryptUtil {
private static StandardPBEStringEncryptor createEncryptor() { private static StandardPBEStringEncryptor createEncryptor() {
StandardPBEStringEncryptor newEncryptor = new StandardPBEStringEncryptor(); StandardPBEStringEncryptor newEncryptor = new StandardPBEStringEncryptor();
// 创建配置对象使用SimplePBEConfig实现类
SimplePBEConfig config = new SimplePBEConfig(); SimplePBEConfig config = new SimplePBEConfig();
config.setAlgorithm(DEFAULT_ALGORITHM); config.setAlgorithm(DEFAULT_ALGORITHM);
config.setPassword(getEncryptionPassword()); config.setPassword(getEncryptionPassword());
config.setKeyObtentionIterations(1000); // 密钥派生迭代次数 config.setKeyObtentionIterations(1000);
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
newEncryptor.setConfig(config); newEncryptor.setConfig(config);
newEncryptor.setStringOutputType("base64");
return newEncryptor; return newEncryptor;
} }

File diff suppressed because it is too large Load Diff

View File

@ -53,8 +53,8 @@ public class TmdbScraperService {
// ==================== TMDB API 配置常量 ==================== // ==================== TMDB API 配置常量 ====================
/** TMDB API 基础地址(通过 Cloudflare Worker 代理访问,解决国内网络无法直连的问题) */ /** TMDB API 基础地址(通过 Vercel 自部署代理访问,解决国内网络无法直连的问题) */
public static final String TMDB_API_BASE = "https://tmdb-proxy.naihun782.workers.dev/tmdb-proxy/3"; public static final String TMDB_API_BASE = "https://tmdb.ldfun.xyz/3";
/** TMDB 图片服务器基础地址(原始尺寸) */ /** TMDB 图片服务器基础地址(原始尺寸) */
public static final String TMDB_IMAGE_BASE = "https://image.tmdb.org/t/p/original"; public static final String TMDB_IMAGE_BASE = "https://image.tmdb.org/t/p/original";
@ -153,8 +153,8 @@ public class TmdbScraperService {
movieRepository.updateScrapeStatus(movieId, "failed", "用户未配置TMDB API Key"); movieRepository.updateScrapeStatus(movieId, "failed", "用户未配置TMDB API Key");
return errorResult("用户未配置TMDB API Key请先设置"); return errorResult("用户未配置TMDB API Key请先设置");
} }
// UserDO.tmdbApiKey 是普通 String 字段没有 Jasypt 自动解密注解
// 解密API Key // 数据库中存储的是密文必须手动解密后才能调用 TMDB API
var apiKey = EncryptUtil.decrypt(encryptedKey); var apiKey = EncryptUtil.decrypt(encryptedKey);
// 更新刮削状态为刮削中 // 更新刮削状态为刮削中
@ -221,9 +221,10 @@ public class TmdbScraperService {
} catch (Exception e) { } catch (Exception e) {
LOGGER.log(Level.SEVERE, "[TmdbScraper] 刮削异常: movieId=" + movieId, e); LOGGER.log(Level.SEVERE, "[TmdbScraper] 刮削异常: movieId=" + movieId, e);
// 更新刮削状态为失败 // 更新刮削状态为失败e.getMessage() 可能为 null NullPointerException
movieRepository.updateScrapeStatus(movieId, "failed", "刮削异常: " + e.getMessage()); String errorMsg = e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName();
return errorResult("刮削异常: " + e.getMessage()); movieRepository.updateScrapeStatus(movieId, "failed", "刮削异常: " + errorMsg);
return errorResult("刮削异常: " + errorMsg);
} }
} }