package org.chinobot.sensitive.utils;
import com.alibaba.fastjson.JSON;
import org.chinobot.sensitive.type.handler.*;
import org.chinobot.sensitive.udfs.DecryptStr;
import org.chinobot.sensitive.udfs.EncryptStr;
import org.springframework.util.StringUtils;
import java.util.*;
public class SensitiveDataSolveUtil {
private static String keyPswStr = "2170577f29b17d6787782f35998c4a88";
/**
* 脱敏方法入口
* @param data 要脱敏的数据,必须为list,map,实体类中的一种
* @param tmType 脱敏加密类型
* DEC 解密 ENC 加密
* ADDRESS 收货地址脱敏处理类
* BANDCARD 银行卡号脱敏
* CNAPS 公司开户银行联号
* DAFAULT 默认脱敏
* EMAIL 邮件信息脱敏处理类
* FIXEDPHONE 座机信息脱敏
* IDCARD 身份证号脱敏类型
* MOBILEPHONE 手机号脱敏处理类
* NAME 姓名脱敏的解析类
* PAYSIGNNO 签约协议号脱敏方式
* @param sensitiveColumn 要加密的字段
*/
public static Object encodeSensitiveData(Object data,String tmType,String... sensitiveColumn){
if (data==null || sensitiveColumn.length==0){
return data;
}
//先转化为json对象
JSON rawJson = (JSON) JSON.toJSON(data);
List<String> sensitiveColumnList= Arrays.asList(sensitiveColumn);
dealWithRecursion(sensitiveColumnList,tmType,null,rawJson);
return JSON.parseObject(rawJson.toString(), data.getClass());
}
private static Object dealWithRecursion(List<String> sensitiveColumnList,String tmType,String key,Object object) {
//为JsonObject
if (object instanceof Map) {
Map jsonObject = (Map) object;
Set keySet = jsonObject.keySet();
for (Object o : keySet) {
if (jsonObject.get(o) instanceof Map) {
Map ooo = (Map) jsonObject.get(o);
if (ooo==null) {
jsonObject.put(o, null);
} else {
dealWithRecursion(sensitiveColumnList,tmType,o.toString(),jsonObject.get(o));
}
} else if (jsonObject.get(o) instanceof List) {
dealWithRecursion(sensitiveColumnList,tmType,o.toString(),jsonObject.get(o));
} else {
jsonObject.put(o, encodeSensitiveDataMap(tmType,o.toString(),jsonObject.get(o),sensitiveColumnList));
}
}
return jsonObject;
} else if (object instanceof List) {
//为JsonArray
List<Object> list = new ArrayList<>();
List jsonArray = (List) object;
for (Object o : jsonArray) {
list.add(dealWithRecursion(sensitiveColumnList,tmType,key,o));
}
return list;
} else {
return encodeSensitiveDataMap(tmType,key,object,sensitiveColumnList);
}
}
//处理单个json的map
private static Object encodeSensitiveDataMap(String tmType,String key,Object value, List<String> sensitiveColumnList) {
if (sensitiveColumnList.contains(key)){
return encodeNumber(tmType,value);
}
return value;
}
//加密数据
public static Object encodeNumber(String tmType,Object data){
if (data==null){
return data;
}
String number=data.toString();
if (StringUtils.isEmpty(number)){
return data;
}
String valStr = "";
if(null == tmType){
valStr = new DafaultSensitiveHandler().handle(data);
}else{
switch (tmType) {
case "DEC": //解密
valStr = DecryptStr.evaluate(number,keyPswStr);
if(null == valStr){
valStr = number;
}
break;
case "ENC": //加密
valStr = EncryptStr.evaluate(number,keyPswStr);
if(null == valStr){
valStr = number;
}
break;
case "ADDRESS"://收货地址脱敏处理类
valStr = new AddressSensitiveHandler().handle(data);
break;
case "BANDCARD"://银行卡号脱敏
valStr = new BandCardSensitiveHandler().handle(data);
break;
case "CNAPS"://公司开户银行联号
valStr = new CnapsSensitiveHandler().handle(data);
break;
case "EMAIL"://邮件信息脱敏处理类
valStr = new EmailSensitiveHandler().handle(data);
break;
case "FIXEDPHONE"://座机信息脱敏
valStr = new FixedPhoneSensitiveHandler().handle(data);
break;
case "IDCARD"://身份证号脱敏类型
valStr = new IDCardSensitiveHandler().handle(data);
break;
case "MOBILEPHONE"://手机号脱敏处理类
valStr = new MobilePhoneSensitiveHandler().handle(data);
break;
case "NAME"://姓名脱敏的解析类
valStr = new NameSensitiveHandler().handle(data);
break;
case "PAYSIGNNO"://签约协议号脱敏方式
valStr = new PaySignNoSensitiveHandler().handle(data);
break;
default:
valStr = new DafaultSensitiveHandler().handle(data);
break;
}
}
return valStr;
}
//下面为测试代码
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("phone","12312345678");
map.put("name","张三丰");
//打印{phone=123****5678, name=jack}
map = (Map<String, String>) encodeSensitiveData(map,"NAME","name");
map = (Map<String, String>) encodeSensitiveData(map,"MOBILEPHONE","phone");
System.out.println(map);
List<Map<String,String>> list=new ArrayList<>();
list.add(map);
list.add(map);
//打印[{"phone":"123****5678","name":"jack"}, {"phone":"123****5678","name":"jack"}]
System.out.println(encodeSensitiveData(list,"NAME","name"));
System.out.println(encodeSensitiveData(list,"MOBILEPHONE","phone"));
System.out.println(map);
//User user=new User();
//user.setIdcard("78787878787878");
//user.setPhone("12312345678");
//打印User{phone='123****5678', idcard='787****7878'}
//System.out.println(encodeSensitiveData(user,"","phone","idcard"));
}
}
数据脱敏及加解密(springboot)
最新推荐文章于 2024-05-04 01:59:52 发布