From b1097dce55d857ae1ae63798911c1e7027c00de4 Mon Sep 17 00:00:00 2001 From: chenjiahe <763432473@qq.com> Date: 星期五, 28 一月 2022 14:55:11 +0800 Subject: [PATCH] Mysql数据库AES加密工具 --- src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java | 182 +++++++++++++++++++++++++++++---------------- 1 files changed, 116 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java b/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java index 2c5abcc..92b46d7 100644 --- a/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java +++ b/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java @@ -12,10 +12,7 @@ import javax.annotation.PostConstruct; import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class InitMysqlData { @@ -28,81 +25,134 @@ //椤圭洰鍚姩鐨勬椂鍊欏~鍏� if(!StringUtils.isEmpty(packPath)){ Set<Class<?>> classes = VariableAesKey.classData(packPath); - Map<String,String> aesKeysFild = new HashMap<>(); - boolean isAes = false; - String tableName = null; - String fildName = null; - String fildValue = null; SqlSentence sqlSentence = new SqlSentence(); Map<String,Object> values = new HashMap<>(); - for(Class<?> cl:classes){ - //琛ㄥ悕绉� - boolean hasAnnotation = cl.isAnnotationPresent(Table.class); - if(!hasAnnotation){ - continue; + //瑙f瀽琛ㄦ暟鎹� + List<FieldData> fieldDatas = entityhandle(classes); + + StringBuilder selectField; + StringBuilder setField; + for(FieldData fieldData:fieldDatas){ + //鑾峰彇鏉℃暟 + sqlSentence.sqlSentence("SELECT COUNT(0) FROM "+fieldData.getTableName(),values); + int total = commonService.selectCountSql(sqlSentence); + + //鏌ヨ鏁版嵁 + selectField = new StringBuilder(); + selectField.append(fieldData.getId()); + for(String fieldName:fieldData.getEncrypFields()){ + selectField.append(","+fieldName); } - Table table = cl.getAnnotation(Table.class); - tableName = table.name(); + sqlSentence.sqlSentence("SELECT "+selectField.toString()+" FROM "+fieldData.getTableName(),values); - aesKeysFild = new HashMap<>(); - isAes = false; - - // 鍙栧緱鏈被鐨勫叏閮ㄥ睘鎬� - Field[] fields = cl.getDeclaredFields(); - fields = VariableAesKey.getPatentFields(fields,cl); - for (Field field:fields) { - fildName = null; - // 鍒ゆ柇鏂规硶涓槸鍚︽湁鎸囧畾娉ㄨВ绫诲瀷鐨勬敞瑙� - hasAnnotation = field.isAnnotationPresent(MysqlHexAes.class); - if (hasAnnotation) { - // 鏍规嵁娉ㄨВ绫诲瀷杩斿洖鏂规硶鐨勬寚瀹氱被鍨嬫敞瑙� - MysqlHexAes mysqlHexAes = field.getAnnotation(MysqlHexAes.class); - - //String aesKeyField = mysqlHexAes.aesKeyField(); - String aesKey = mysqlHexAes.aesKey(); - - if(StringUtils.isEmpty(aesKey)){ - aesKey = VariableAesKey.AES_KEY; - if(StringUtils.isEmpty(aesKey)){ - throw new RuntimeException("mysql鐨凙ES绉橀挜涓嶈兘涓虹┖:"+field.getName()); - } + //鏇存柊鏁版嵁 + List<Map<String,Object>> list = commonService.selectListMap(CommonMapper.class,sqlSentence); + for (Map<String,Object> map:list){ + setField = new StringBuilder(); + for (Map.Entry<String, Object> entry : map.entrySet()) { + String mapKey = entry.getKey(); + String mapValue = (String) entry.getValue(); + if(StringUtils.isEmpty(mapValue)){ + continue; } + if(mapValue.length()%32==0 && MysqlHexAesTool.isHexStrValid(mapValue)){ + continue; + } + if(setField.length()>0){ + setField.append(","); + } + setField.append(mapKey+" = #{m."+mapKey+"}"); + } - hasAnnotation = field.isAnnotationPresent(Column.class); - if(hasAnnotation){ - Column column = field.getAnnotation(Column.class); - fildName = column.name(); - } - if(StringUtils.isEmpty(fildName)){ - fildName = field.getName(); - } - - sqlSentence.sqlSentence("SELECT id,"+fildName+" FROM "+tableName,values); - List<Map<String,Object>> list = commonService.selectListMap(CommonMapper.class,sqlSentence); - for(Map<String,Object> map:list){ - fildValue = (String)map.get(fildName); - System.out.println("fildValue:"+fildValue); - if(StringUtils.isEmpty(fildValue)){ - continue; - } - if(fildValue.length()%32==0 && MysqlHexAesTool.isHexStrValid(fildValue)){ - continue; - } - values.clear(); - values.put("id",map.get("id")); - values.put("filedData",fildValue); - sqlSentence.sqlSentence("UPDATE "+tableName+" SET "+fildName+" = #{m.filedData} WHERE id = #{m.id}",values); - if(commonService.updateSentence(sqlSentence)!=1){ - throw new ServiceException("鏇存柊瓒呰繃1鏉★紝鏇存柊澶辫触锛�"); - } - } + values = map; + sqlSentence.sqlSentence("UPDATE "+fieldData.getTableName()+" SET "+setField.toString()+" WHERE id = #{m.id}",values); + if(commonService.updateSentence(sqlSentence)!=1){ + throw new ServiceException("鏇存柊瓒呰繃1鏉★紝鏇存柊澶辫触锛�"); } } } } } + /**鑾峰彇鍒拌〃鐨勬暟鎹�*/ + public static List<FieldData> entityhandle(Set<Class<?>> classes){ + + List<FieldData> fildDatas = new ArrayList<>(); + //瀛樺偍鍗曡〃瀛楁淇℃伅 + FieldData fildData; + //瀛樺偍闇�瑕佸姞瀵嗙殑瀛楁 + Set<String> encrypFields; + + String fildName; + + for(Class<?> cl:classes){ + fildData = new FieldData(); + encrypFields = new HashSet<>(); + + //琛ㄥ悕绉� + if(!cl.isAnnotationPresent(Table.class)){ + continue; + } + Table table = cl.getAnnotation(Table.class); + fildData.setTableName(table.name()); + + // 鍙栧緱鏈被鐨勫叏閮ㄥ睘鎬� + Field[] fields = cl.getDeclaredFields(); + fields = VariableAesKey.getPatentFields(fields,cl); + for (Field field:fields) { + + fildName = null; + if(field.isAnnotationPresent(Column.class)){ + Column column = field.getAnnotation(Column.class); + fildName = column.name(); + if(StringUtils.isEmpty(fildName)){ + fildName = field.getName(); + } + if(column.isKey()){ + fildData.setId(fildName); + } + }else{ + fildName = field.getName(); + } + + // 鍒ゆ柇鏂规硶涓槸鍚︽湁鎸囧畾娉ㄨВ绫诲瀷鐨勬敞瑙� + if (!field.isAnnotationPresent(MysqlHexAes.class)) { + continue; + } + // 鏍规嵁娉ㄨВ绫诲瀷杩斿洖鏂规硶鐨勬寚瀹氱被鍨嬫敞瑙� + MysqlHexAes mysqlHexAes = field.getAnnotation(MysqlHexAes.class); + //鍒ゆ柇鐗堟湰鍙锋槸涓嶆槸涓�鏍风殑 + if(!StringUtils.isEmpty(VariableAesKey.INIT_VERSION)){ + if(!VariableAesKey.INIT_VERSION.equals(mysqlHexAes.initVersion())){ + continue; + } + }else{ + if(!StringUtils.isEmpty(mysqlHexAes.initVersion())){ + continue; + } + } + + String aesKey = mysqlHexAes.aesKey(); + if(StringUtils.isEmpty(aesKey)){ + aesKey = VariableAesKey.AES_KEY; + if(StringUtils.isEmpty(aesKey)){ + throw new RuntimeException("mysql鐨凙ES绉橀挜涓嶈兘涓虹┖:"+field.getName()); + } + } + + encrypFields.add(fildName); + } + //鏄惁鏈夐渶瑕佸姞瀵嗗緱瀛楁 + if(encrypFields.size()<=0){ + continue; + } + fildData.setEncrypFields(encrypFields); + fildDatas.add(fildData); + } + return fildDatas; + } + } -- Gitblit v1.8.0