使用注解实现加解密方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/**
 * 对象隐私数据加解密工具类.
 *
 * @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);
        }
    }
}

  解密调用

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

  加密调用

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

  

posted @   屠城校尉杜  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-11-03 如何生成和分析Dump文件
点击右上角即可分享
微信分享提示