Rsa统一解密工具类

前提说明

本文针对Rsa加密后的数据进行统一解密操作,针对String/Map/实体类,有几点有需要注意的:

  1. 个人解密后的字符串长度为172的倍数 ,如果有不一致的,自行修改;
  2. 此工具类会对map和实体类进行遍历,如果数据量大的情况下会有一定的性能问题;
  3. 针对实体类,只做了对Integer/String/bigdemal类型的处理,如果实体类有其他类型,需自行加上,不然返回的类会丢失其他类型部分的数据
  4. 此工具类主要解决的是针对不特定对象,减少对每一个具体对象或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;
        }
    }
}

实体类型调用

  1. 实体类型需要借助 ObjectMapper 进行object与实体类的转换
  2. 借助 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();

结束,望各位技术大牛点拨、更正、优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值