package com.xiaopeng.common.core.utils; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** * 敏感数据确定性加解密工具。 *

* 当前为了支持数据库等值查询,使用 AES/ECB。后续迁移到配置化密钥时只需要替换 KEY 来源。 */ public final class SensitiveDataCryptoUtil { private static final String KEY = AESUtil.generateKeyFromPassword("robotaxi-sensitive-data-2026", AESUtil.KEY_LENGTH_128); private SensitiveDataCryptoUtil() { } public static String encrypt(String value) { if (!StringUtils.isNotBlank(value)) { return value; } String trimmed = value.trim(); if (isEncrypted(trimmed)) { return trimmed; } return AESUtil.encryptByECB(trimmed, KEY); } public static String decryptIfPossible(String value) { if (!StringUtils.isNotBlank(value)) { return value; } String trimmed = value.trim(); try { return AESUtil.decryptByECB(trimmed, KEY); } catch (Exception ignored) { return value; } } public static List queryValues(String plainValue) { if (!StringUtils.isNotBlank(plainValue)) { return new ArrayList<>(); } String trimmed = plainValue.trim(); Set values = new LinkedHashSet<>(); values.add(trimmed); values.add(encrypt(trimmed)); return new ArrayList<>(values); } public static List encryptValues(Iterable plainValues) { Set values = new LinkedHashSet<>(); if (plainValues == null) { return new ArrayList<>(); } for (String plainValue : plainValues) { if (StringUtils.isNotBlank(plainValue)) { values.add(encrypt(plainValue)); } } return new ArrayList<>(values); } private static boolean isEncrypted(String value) { try { String decrypted = AESUtil.decryptByECB(value, KEY); return StringUtils.isNotBlank(decrypted) && !decrypted.equals(value); } catch (Exception ignored) { return false; } } }