Rsa统一解密工具类
前提说明
本文针对Rsa加密后的数据进行统一解密操作,针对String/Map/实体类,有几点有需要注意的:
- 个人解密后的字符串长度为172的倍数 ,如果有不一致的,自行修改;
- 此工具类会对map和实体类进行遍历,如果数据量大的情况下会有一定的性能问题;
- 针对实体类,只做了对Integer/String/bigdemal类型的处理,如果实体类有其他类型,需自行加上,不然返回的类会丢失其他类型部分的数据
- 此工具类主要解决的是针对不特定对象,减少对每一个具体对象或map集合的相应属性的加解密代码的编写。加解密部分的代码自行找寻搜罗。
工具类代码
public class GlobalUtil {
/**
* @desc: 通用方法,将String类型参数、map的value、实体类属性值 判断是否需要解密并解密返回原参数值
* @author gjx
* @date
* @param /String/Map/Entity对象
* @return 返回原参数
*/
public static Object publicDecryptData(Object obj){
if (obj == null){
return null;
}
if (obj instanceof java.lang.String){
String str = (String) obj;
if (!StringUtils.isBlank(str) && str.length()%172 == 0){
try{
//解密方法
String s = RsaUtilToWx.decryptByPrivateKey(str, RsaUtilToWx.PRIVATE_KEY);
return s;
}catch (Exception e){
return obj;
}
}
return str;
}else if(obj instanceof java.util.Map){
Map<String, Object> map = (Map<String, Object>) obj;
for (String key : map.keySet()) {
String value = map.get(key).toString();
if (!StringUtils.isBlank(value) && value.length()%172 == 0){
try{
String s = RsaUtilToWx.decryptByPrivateKey(value, RsaUtilToWx.PRIVATE_KEY);
map.put(key, s);
}catch (Exception e){
}
}
}
return map;
}else {
Class tempClass= obj.getClass();
Field[] fields = tempClass.getDeclaredFields();
Map<String, Object> map = new HashMap<>();
for (Field field : fields) {
String type = field.getType().getName();
try{
if (type.equals("java.lang.String")){
field.setAccessible(true);
String s = (String) field.get(obj);
if (!StringUtils.isBlank(s) && s.length()%172 == 0){
try{
s = RsaUtilToWx.decryptByPrivateKey(s, RsaUtilToWx.PRIVATE_KEY);
map.put(field.getName(), s);
}catch (Exception e){
map.put(field.getName(), s);
}
}else{
String name = field.getName();
map.put(name, s);
}
}else if (type.equals("java.lang.Integer")){
field.setAccessible(true);
if (field.get(obj)!=null){
String name = field.getName();
map.put(name, Integer.parseInt(field.get(obj).toString()));
}
}else if (type.equals("java.math.BigDecimal")){
field.setAccessible(true);
if (field.get(obj)!=null){
String name = field.getName();
map.put(name, new BigDecimal(field.get(obj).toString()));
}
}
//如果实体类有更多类型,比如double等,需要自行补充相应的类型的操作代码
}catch (Exception e){
e.printStackTrace();
}
}
Object object = JSON.parseObject(JSON.toJSONString(map), Object.class);
return object;
}
}
}
实体类型调用
- 实体类型需要借助 ObjectMapper 进行object与实体类的转换
- 借助 BeanUtils.copyProperties() 方法将属性值赋给原对象。即在list集合遍历过程中不能直接将objectMapper.convertValue(GlobalUtil.publicDecryptData(applyMeal),ApplyMeal.class)的返回值赋值给原对象,会失败
ObjectMapper objectMapper = new ObjectMapper();
ApplyMeal applyMeal1 = objectMapper.convertValue(GlobalUtil.publicDecryptData(applyMeal), ApplyMeal.class);
BeanUtils.copyProperties(applyMeal1, applyMeal);
Map类型调用
Map<String, Object> map = (Map<String, Object>) GlobalUtil.publicDecryptData(map);
String类型调用
String str = "xxxx";
Object o = GlobalUtil.publicDecryptData(str);
str = o.toString();
结束,望各位技术大牛点拨、更正、优化。