1:需求 一个对象部分属性属于敏感字段,需要有加密和解密的操作。
思路:通常办法是定义一个util 有加密和解密两个方法,加密的时候获取对象属性 然后加密 然后再覆盖
晋级方法:自定义注解的形式,需要加密的字节上添加该注解,定义工具类,工具类有加密和解密两个方法,加密时候把对象交给该工具类 自动完成属性加密
步骤 1 ,自定义需要加密解密的注解
public @interface Encrypt {
enum type{BASE64,DES}
type type()default type.DES;
}
2,自定义传输对象
class A{
private String name;
@@Encrypt(type= type.DES)
private String password
}
3,自定义工具类
3.1 思路 获取实例,需要加密的属性
Field[] fields = t.getClass().getDeclaredFields();
Encrypt encrypt = field.getAnnotation(Encrypt.class);
3.2 获取属性的值
field = field.substring(0, 1).toUpperCase() + att.substring(1);
method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
3.3 设置属性的新值
Method method = obj.getClass().getMethod("set" + att, field.getType());
return method.invoke(obj, arg);
3.3 string 对象加密
public static StringencodeStr(String plainText){
byte[] b=plainText.getBytes();
return Base64.encodeBase64URLSafeString(b);
}
3.4 string对象解密
BASE64Encoder base64Encoder =new BASE64Encoder();
byte[] byteMi=encryptByte(keySecert,strMing.getBytes());
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec zeroIv =new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, getKey(keySecert),zeroIv);
return cipher.doFinal(data);