利用java反射加解密对象属性

110 阅读1分钟

1.依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.21</version>
</dependency>

2.加密工具类


import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;

/**
 * 加密工具类
 *
 * @author kfg
 */
public class Encrypted {

    private static final String KEY = "1234567890123456";
    private static DES des;

    static {
       des= SecureUtil.des(SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(),KEY.getBytes()).getEncoded());
    }

    public static String encode(String value) {
        return des.encryptBase64(value);
    }

    public static String decode(String value) {
        return des.decryptStr(value);
    }
}

3.反射对象

import lombok.Data;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @author kfg
 */
@Data
public class BaseModel {

    private static List<String> attributes;
    private final String set = "set";

    {
        attributes = new ArrayList<>();
        attributes.add("name");
        attributes.add("desc");
    }

    /**
     * 加密
     * @return
     * @throws Exception
     */
    public BaseModel encode() throws Exception {
        return updateField(UpdateType.ENCODE);
    }

    /**
     * 解密
     * @return
     * @throws Exception
     */
    public BaseModel decode() throws Exception {
        return updateField(UpdateType.DECODE);
    }

    /**
     * 脱敏
     * @return
     * @throws Exception
     */
    public BaseModel hidden() throws Exception {
        return updateField(UpdateType.HIDDEN);
    }

    /**
     * 修改属性值
     *
     * @param type
     * @return
     */
    private BaseModel updateField(UpdateType type) throws Exception {

        Class clz = this.getClass();

        for (String attribute : attributes) {
            // 取属性
            Field field = clz.getDeclaredField(attribute);
            field.setAccessible(true);
            String value = (String) field.get(this);
            // 取函数
            String methodName = set + attribute.substring(0, 1).toUpperCase() + attribute.substring(1);
            Method method = clz.getDeclaredMethod(methodName, field.getType());
            // 更新属性
            switch (type) {
                case DECODE:
                    method.invoke(this, Encrypted.decode(value));
                case ENCODE:
                    method.invoke(this, Encrypted.encode(value));
                case HIDDEN:
                    method.invoke(this, value.substring(0, 1) + "****" + value.substring(3));
                default:
                    break;
            }
        }

        return this;
    }

    /**
     * 字段修改类型
     */
    enum UpdateType {
        ENCODE, // 加密
        DECODE, // 解密
        HIDDEN  // 脱敏
    }
}