首页 > 其他分享 >使用注解实现加解密方式

使用注解实现加解密方式

时间:2022-11-03 20:22:12浏览次数:65  
标签:方式 List object 加解密 param vo field fieldName 注解

/**
 * 对象隐私数据加解密工具类.
 *
 * @author d
 * @since 2018年05月22日
 */
public final class PrivacyDataHandler {
    private static ConcurrentHashMap<String, List<PrivacyDataVo>> encryptMap = new ConcurrentHashMap<>();
    private static final Logger logger = LoggerFactory.getLogger(PrivacyDataHandler.class);

    /**
     * 获得对象中的加密域
     *
     * @param object 对象
     * @return 加密域
     */
    public static synchronized List<PrivacyDataVo> getEncryptList(Object object) {
        String key = object.getClass().toString();
        if (null == encryptMap.get(key)) {
            fillEncryptMap(object);
        }
        List<PrivacyDataVo> field = new ArrayList<>(encryptMap.get(key));
        return field;
    }

    /**
     * 过得加密列表
     *
     * @param object 对象
     * @return 加密列表
     */
    public static synchronized Map<String, List<PrivacyDataVo>> getEncryptListWithOldVer(Object object) {
        Map<String, List<PrivacyDataVo>> map = new HashMap<>();
        List<PrivacyDataVo> cipherList = getEncryptList(object);
        Iterator<PrivacyDataVo> iter = cipherList.iterator();
        List<PrivacyDataVo> clearList = new ArrayList<>();
        List<PrivacyDataVo> ver2 = new ArrayList<>();
        while (iter.hasNext()) {
            PrivacyDataVo vo = iter.next();
            if ("0".equals(vo.getVersion())) {
                clearList.add(vo);
                iter.remove();
            }
            if ("2".equals(vo.getVersion())) {
                ver2.add(vo);
                iter.remove();
            }
        }

        // 之前未加密
        map.put("VER_0", clearList);

        // 之前用ECB方式加密
        map.put("VER_1", cipherList);

        // 之前用ECB方式加密,现在为空不处理
        map.put("VER_2", ver2);
        return map;
    }

    /**
     * 获取实体所有注解字段
     *
     * @param object 对象
     */
    private static void fillEncryptMap(Object object) {
        String key = object.getClass().toString();
        List<PrivacyDataVo> field = new ArrayList<>();
        Class<?> aClass = object.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for (Field srcField : fields) {
            PrivacyData privacyData = srcField.getAnnotation(PrivacyData.class);
            if (null == privacyData) {
                continue;
            }
            String srcName = srcField.getName();
            if (privacyData.value()) {
                PrivacyDataVo vo = new PrivacyDataVo();
                vo.setValue(true);
                vo.setFieldName(srcName);
                vo.setVersion(privacyData.version());
                vo.setCharset(privacyData.charset());
                field.add(vo);
            }
        }
        encryptMap.put(key, field);
    }

    /**
     * 获得加解密域的值
     *
     * @param object 对象
     * @param field 字段
     * @return 加解密域的值
     */
    public static List<String> getOriginalTextList(Object object, List<PrivacyDataVo> field) {
        if (null == field) {
            return null;
        }
        List<String> values = new ArrayList<>();
        Iterator<PrivacyDataVo> iter = field.iterator();
        while (iter.hasNext()) {
            PrivacyDataVo vo = iter.next();
            String fieldName = vo.getFieldName();
            String fieldValue = (String) getFieldValue(object, fieldName);
            if (StringUtils.isEmpty(fieldValue)) {
                iter.remove();
                continue;
            }
            values.add(fieldValue);
        }
        return values;
    }

    /**
     * 设置隐私字段值
     *
     * @param object 待处理的对象
     * @param field object带有PrivacyData的字段
     * @param value 隐私数据待替换的值
     * @param excludedFields 带有PrivacyData不被替换的字段
     * @param <T> 参数化类型
     * @return 返回
     */
    public static <T> T setPrivacyDataFiledValue(T object, List<PrivacyDataVo> field, String value,
        String[] excludedFields) {
        if (null == field) {
            return null;
        }
        List<String> excludedFieldList = null;
        if (null != excludedFields) {
            excludedFieldList = Arrays.asList(excludedFields);
        }
        Iterator<PrivacyDataVo> iter = field.iterator();
        while (iter.hasNext()) {
            PrivacyDataVo vo = iter.next();
            String fieldName = vo.getFieldName();
            if (null != excludedFieldList && excludedFieldList.contains(fieldName)) {
                continue;
            }

            // 加密数据设置空
            setFieldValue(object, fieldName, value);
        }
        return object;
    }

    /**
     * 设置加解密值到原对象
     *
     * @param object 对象
     * @param field 字段
     * @param sksResult SKS结果
     */
    public static void dealSksResult(Object object, List<PrivacyDataVo> field, List<String> sksResult) {
        for (int i = 0; i < field.size(); i++) {
            String fieldName = field.get(i).getFieldName();
            setFieldValue(object, fieldName, sksResult.get(i));
        }
    }

    /**
     * 获得Obj对象的fieldName属性的值
     *
     * @param obj 对象
     * @param fieldName 字段
     * @return 返回值
     */
    public static Object getFieldValue(Object obj, String fieldName) {
        Object value = null;
        if (null == obj) {
            return value;
        }
        try {
            value = PropertyUtils.getProperty(obj, fieldName);
        } catch (Exception e) {
            logger.error("getFieldValue failed: ", e.getLocalizedMessage(), e);
        }
        return value;
    }

    /**
     * 设置Obj对象的fieldName属性的值
     *
     * @param obj 对象
     * @param fieldName 字段名
     * @param value 值
     */
    private static void setFieldValue(Object obj, String fieldName, String value) {
        if (null == obj) {
            return;
        }
        try {
            PropertyUtils.setProperty(obj, fieldName, value);
        } catch (Exception e) {
            logger.error("setFieldValue failed: ", e.getLocalizedMessage(), e);
        }
    }
}

  解密调用

List<PrivacyDataVo> privacyDataVoList = PrivacyDataHandler.getEncryptList(object);
        List<String> originalTextList = PrivacyDataHandler.getOriginalTextList(object, privacyDataVoList);

  加密调用

List<PrivacyDataVo> privacyDataVos = PrivacyDataHandler.getEncryptList(temp);
        T clearedObject = PrivacyDataHandler.setPrivacyDataFiledValue(temp, privacyDataVos, null, excludedFields);

  

标签:方式,List,object,加解密,param,vo,field,fieldName,注解
From: https://www.cnblogs.com/dukedu/p/16855710.html

相关文章

  • 实时渲染将如何改变工作方式
    艺术家和TD正在转向实时引擎,以加快内容生成过程大多数工作站中的图形卡也能够使用实时渲染的潜在功能生成高质量的图像,建筑可视化已经很好地利用了图形卡和某些应用程序,其......
  • jquery获取所有子元素遍历_Cypress 页面元素基本操作方式
    获取DOM元素基本方式.find(selector)搜索定位元素.get(selector)搜索定位元素.contains(selector)搜索定位元素.children()方法用来获取DON元素的子元素.parents......
  • 前端多方式登录功能完成
    逻辑导航1.当在前端输入用户名和密码之后,点击登录,后端校验完毕返回前端2.前端拿到需要首先做个判断,判断用户是否输入用户名和密码,未输入则发出提示;输入了则发送post请求......
  • 注解 @Component及@Controller等,@Autowired,@Resource
    注解:对于DI使用注解,将不再需要在Spring配置文件中声明bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变。需要在Spring配置文件中配......
  • django项目使用uwsgi方式启动
    django项目使用uwsgi方式启动环境:虚拟机ubuntu20.0django2.2python3.6.8基于docker部署前言目的:由pythonmanage.pyrunserver单进程的启动方式,更改为使用uwsgi......
  • Struts2输入校验剖析之编码方式校验
    Struts2提供了两种校验方式。使用编码方式进行校验新建register.jsp页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%......
  • Struts2输入校验剖析之编码方式校验
    Struts2提供了两种校验方式。使用编码方式进行校验新建register.jsp页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%......
  • Struts2输入校验剖析之编码方式校验
    Struts2提供了两种校验方式。使用编码方式进行校验新建register.jsp页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%......
  • Struts2输入校验剖析之编码方式校验
    Struts2提供了两种校验方式。使用编码方式进行校验新建register.jsp页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%......
  • Struts2输入校验剖析之编码方式校验
    Struts2提供了两种校验方式。使用编码方式进行校验新建register.jsp页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%......