版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23888451/article/details/84660197
对数据库的数据进行加密,包括用户数据、项目数据、聊天数据等,需要在插入表的的时候进行加密,查询的时候进行解密。利用java的反射机制,创建以下工具类,对数据进行加解密。
public class CryptoUtil {
/**
* 加密、解密方法
* @param obj要加密或解密的对象
* @param type 1加密操作,2解密操作
* @throws Exception
*/
public static void cryptoObject(Object obj,Integer type) throws Exception{
Class cls = obj.getClass();
//思路:获取object的属性名称-->获取object的属性值-->对值进行加密/解密-->将加密后的值set回属性中
Field[] fields = cls.getDeclaredFields();
if(fields!=null&&fields.length>0){
for(Field field : fields){
field.setAccessible(true);//设置这些属性是可访问的
Type fieldType = field.getGenericType();//返回属性声的Type类型
// Class fieldType = field.getType();//获取属性声明时类型对象(返回class对象)
if(fieldType.toString().equals("class java.lang.String")){//只对String类型的数据加密
String fieldName = field.getName();
String fieldValue = (String)field.get(obj);//获取属性的值
if(fieldValue!=null&&!"".equals(fieldValue)){
String encValue = null;
switch (type) {
case 1:
encValue = AESUtil.encrypt(fieldValue);//进行加密
break;
case 2:
encValue = AESUtil.decrypt(fieldValue);//进行加密
break;
}
field.set(obj, encValue);//设置属性的值
}
}
}
}
}
}
加密和解密的方法AESUtil.encrypt()、AESUtil.decrypt()参考:https://blog.csdn.net/qq_23888451/article/details/84658360
遇到的问题:
1.java.lang.IllegalAccessException: Class com.zz.util.CryptoUtil can not access a member of class com.zz.manage.model.Message with modifiers “private”。
Message类的属性设置为private,如果不设置field.setAccessible(true),将会报这个错误。
2.field.getGenericType()和field.getType()的区别
- 返回的类型不一样,一个是Class对象一个是Type接口
- 如果属性是一个泛型,从getType()只能得到这个属性的接口类型。但是getGenericType()还可以得到这个泛型的参数类型
- getGenericType()如果当前属性有签名属性类型就返回,都则就返回Field.getType()
- 本知识点参考反射API