package com.xiaopeng.common.core.utils;
|
|
import java.util.ArrayList;
|
import java.util.LinkedHashSet;
|
import java.util.List;
|
import java.util.Set;
|
|
/**
|
* 敏感数据确定性加解密工具。
|
* <p>
|
* 当前为了支持数据库等值查询,使用 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<String> queryValues(String plainValue) {
|
if (!StringUtils.isNotBlank(plainValue)) {
|
return new ArrayList<>();
|
}
|
String trimmed = plainValue.trim();
|
Set<String> values = new LinkedHashSet<>();
|
values.add(trimmed);
|
values.add(encrypt(trimmed));
|
return new ArrayList<>(values);
|
}
|
|
public static List<String> encryptValues(Iterable<String> plainValues) {
|
Set<String> 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;
|
}
|
}
|
}
|