数据脱敏及加解密(springboot)

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"));
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于数据脱敏的代码,可以使用Spring Boot框架中的注解来实现。具体来说,可以使用@Sensitive注解来标记需要脱敏的字段,然后在序列化时对这些字段进行脱敏处理。 下面是一个示例代码: ```java import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleFilterProvider filterProvider = new SimpleFilterProvider(); filterProvider.addFilter("sensitiveFilter", SimpleBeanPropertyFilter.serializeAllExcept()); objectMapper.setFilterProvider(filterProvider); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return objectMapper; } } ``` 在上面的代码中,我们定义了一个ObjectMapper的Bean,并且在其中设置了一个SimpleFilterProvider,用于过滤掉被@Sensitive注解标记的字段。同时,我们还设置了JsonInclude.Include.NON_NULL,用于过滤掉值为null的字段。 接下来,我们可以在需要脱敏的字段上添加@Sensitive注解,例如: ```java public class User { private Long id; @Sensitive private String name; @Sensitive private String phone; // 省略getter和setter方法 } ``` 在序列化时,被@Sensitive注解标记的字段会被过滤掉,从而实现了数据脱敏的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

k5003

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值