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