From 346eb22b5ab622064d1f61819240656529800f2b Mon Sep 17 00:00:00 2001
From: chenjiahe <763432473@qq.com>
Date: 星期五, 14 一月 2022 13:05:53 +0800
Subject: [PATCH] Mysql数据库AES加密工具

---
 src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java         |  163 +++++++++++++++++---------------
 src/main/java/com/hx/mybatis/aes/springbean/VariableAesKey.java   |  117 +++++++++++++++++------
 src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java |    1 
 3 files changed, 173 insertions(+), 108 deletions(-)

diff --git a/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java b/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java
index 67ce671..71684ef 100644
--- a/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java
+++ b/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java
@@ -71,6 +71,7 @@
         }else if(sqlCommandType == SqlCommandType.DELETE){
             sql = SqlUtils.deleteSql(sql, VariableAesKey.aesKeysTable);
         }
+
         //閫氳繃鍙嶅皠淇敼sql璇彞
         Field field = boundSql.getClass().getDeclaredField("sql");
         field.setAccessible(true);
diff --git a/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java b/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java
index a2ad79e..9281129 100644
--- a/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java
+++ b/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java
@@ -3,10 +3,7 @@
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLExpr;
 import com.alibaba.druid.sql.ast.SQLStatement;
-import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
-import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
 import com.alibaba.druid.sql.ast.statement.*;
-import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement;
 import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
 import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
 import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
@@ -86,14 +83,18 @@
         }
 
         //瑙f瀽from
-        out.delete(0, out.length()) ;
-        sqlSelectQuery.getFrom().accept(sqlastOutputVisitor) ;
-        sqlWhere.append(" FROM "+out);
+        if(sqlSelectQuery.getFrom() != null){
+            out.delete(0, out.length()) ;
+            sqlSelectQuery.getFrom().accept(sqlastOutputVisitor) ;
+            sqlWhere.append(" FROM "+out);
+        }
 
         //瑙f瀽where
-        out.delete(0, out.length()) ;
-        sqlSelectQuery.getWhere().accept(sqlastOutputVisitor) ;
-        sqlWhere.append(" WHERE "+out+" ");
+        if(sqlSelectQuery.getWhere() != null){
+            out.delete(0, out.length()) ;
+            sqlSelectQuery.getWhere().accept(sqlastOutputVisitor) ;
+            sqlWhere.append(" WHERE "+out+" ");
+        }
 
         if(sqlSelectQuery.getGroupBy() != null){
             out.delete(0, out.length()) ;
@@ -183,14 +184,18 @@
         }
 
         //瑙f瀽from
-        out.delete(0, out.length()) ;
-        sqlSelectQuery.getFrom().accept(sqlastOutputVisitor) ;
-        sqlWhere.append(" FROM "+out);
+        if(sqlSelectQuery.getFrom() != null){
+            out.delete(0, out.length()) ;
+            sqlSelectQuery.getFrom().accept(sqlastOutputVisitor) ;
+            sqlWhere.append(" FROM "+out);
+        }
 
         //瑙f瀽where
-        out.delete(0, out.length()) ;
-        sqlSelectQuery.getWhere().accept(sqlastOutputVisitor) ;
-        sqlWhere.append(" WHERE "+out+" ");
+        if(sqlSelectQuery.getWhere() != null){
+            out.delete(0, out.length()) ;
+            sqlSelectQuery.getWhere().accept(sqlastOutputVisitor) ;
+            sqlWhere.append(" WHERE "+out+" ");
+        }
 
         if(sqlSelectQuery.getGroupBy() != null){
             out.delete(0, out.length()) ;
@@ -241,72 +246,72 @@
      * @param aesKeysTable aes绉橀挜
      * @return
      */
-   public static String insertSql(String sql,Map<String,Map<String,String>> aesKeysTable){
-       //瑁呰浇閲嶅啓鐨剆ql璇彞
-       StringBuilder splicingSql = new StringBuilder();
+    public static String insertSql(String sql,Map<String,Map<String,String>> aesKeysTable){
+        //瑁呰浇閲嶅啓鐨剆ql璇彞
+        StringBuilder splicingSql = new StringBuilder();
 
-       sql = SQLUtils.format(sql, JdbcConstants.MYSQL);
-       String[] datas = sql.split("VALUES",2);
+        sql = SQLUtils.format(sql, JdbcConstants.MYSQL);
+        String[] datas = sql.split("VALUES",2);
 
-       splicingSql.append(datas[0]+"VALUES ");
+        splicingSql.append(datas[0]+"VALUES ");
 
-       //閲嶆柊鎷兼帴SQL璇彞
+        //閲嶆柊鎷兼帴SQL璇彞
 
-       //瑙f瀽sql璇彞
-       MySqlStatementParser parser = new MySqlStatementParser(sql);
-       SQLStatement statement = parser.parseStatement();
-       MySqlInsertStatement insert = (MySqlInsertStatement)statement;
+        //瑙f瀽sql璇彞
+        MySqlStatementParser parser = new MySqlStatementParser(sql);
+        SQLStatement statement = parser.parseStatement();
+        MySqlInsertStatement insert = (MySqlInsertStatement)statement;
 
-       String insertName = insert.getTableName().getSimpleName();
+        String insertName = insert.getTableName().getSimpleName();
 
-       //鏍规嵁琛ㄥ悕绉拌幏鍙栧埌AES绉橀挜
-       Map<String,String> aesKeys= aesKeysTable.get(insertName);
-       if(aesKeys == null){
-           return sql;
-       }
+        //鏍规嵁琛ㄥ悕绉拌幏鍙栧埌AES绉橀挜
+        Map<String,String> aesKeys= aesKeysTable.get(insertName);
+        if(aesKeys == null){
+            return sql;
+        }
 
-       //鑾峰彇鎵�鏈夌殑瀛楁
-       List<SQLExpr> columns = insert.getColumns();
+        //鑾峰彇鎵�鏈夌殑瀛楁
+        List<SQLExpr> columns = insert.getColumns();
 
-       String fildValue = null;
-       String aeskey = null;
-       //閬嶅巻鍊�
-       List<SQLInsertStatement.ValuesClause> vcl = insert.getValuesList();
-       for(int j = 0; j<vcl.size(); j++){
-           if( j != 0){
-               splicingSql.append(",");
-           }
-           for(int i = 0;i < columns.size();i++){
-               //鏌ヨ鏀瑰瓧娈垫槸鍚﹂渶瑕佸姞瀵�
-               aeskey = aesKeys.getOrDefault(columns.get(i).toString(),null);
-               fildValue = vcl.get(j).getValues().get(i).toString();
-               if(i == 0){
-                   splicingSql.append("(");
-                   if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
-                       splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
-                   }else{
-                       splicingSql.append(fildValue);
-                   }
-               }else if(i == columns.size()-1){
-                   splicingSql.append(",");
-                   if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
-                       splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
-                   }else{
-                       splicingSql.append(fildValue);
-                   }
-                   splicingSql.append(")");
-               }else{
-                   splicingSql.append(",");
-                   if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
-                       splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
-                   }else{
-                       splicingSql.append(fildValue);
-                   }
-               }
-           }
-       }
-       return splicingSql.toString();
-   }
+        String fildValue = null;
+        String aeskey = null;
+        //閬嶅巻鍊�
+        List<SQLInsertStatement.ValuesClause> vcl = insert.getValuesList();
+        for(int j = 0; j<vcl.size(); j++){
+            if( j != 0){
+                splicingSql.append(",");
+            }
+            for(int i = 0;i < columns.size();i++){
+                //鏌ヨ鏀瑰瓧娈垫槸鍚﹂渶瑕佸姞瀵�
+                aeskey = aesKeys.getOrDefault(columns.get(i).toString(),null);
+                fildValue = vcl.get(j).getValues().get(i).toString();
+                if(i == 0){
+                    splicingSql.append("(");
+                    if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
+                        splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
+                    }else{
+                        splicingSql.append(fildValue);
+                    }
+                }else if(i == columns.size()-1){
+                    splicingSql.append(",");
+                    if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
+                        splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
+                    }else{
+                        splicingSql.append(fildValue);
+                    }
+                    splicingSql.append(")");
+                }else{
+                    splicingSql.append(",");
+                    if(aeskey != null && fildValue.indexOf("AES_ENCRYPT") == -1){
+                        splicingSql.append("HEX(AES_ENCRYPT("+fildValue+",'"+aeskey+"'))");
+                    }else{
+                        splicingSql.append(fildValue);
+                    }
+                }
+            }
+        }
+        return splicingSql.toString();
+    }
 
     /**鏇存柊鍔犲瘑鏁版嵁澶勭悊
      * @param sql sql璇彞
@@ -314,6 +319,7 @@
      * @return
      */
     public static String updateSql(String sql,Map<String,Map<String,String>> aesKeysTable){
+
         //瑁呰浇閲嶅啓鐨剆ql璇彞
         StringBuilder splicingSql = new StringBuilder();
 
@@ -323,7 +329,6 @@
         //鑾峰彇鏍煎紡鍖栫殑slq璇彞
         sql = sqlStatement.toString();
 
-
         MySqlUpdateStatement updateStatement = (MySqlUpdateStatement)sqlStatement;
 
         String insertName = updateStatement.getTableName().getSimpleName();
@@ -331,9 +336,11 @@
         String[] datas = sql.split("WHERE",2);
 
         Map<String,String> aesKeys = aesKeysTable.get(insertName);
+        if(aesKeys == null){
+            return sql;
+        }
 
         splicingSql.append("UPDATE "+insertName+" SET ");
-
         String aeskey = null;
         String fildValue = null;
         List<SQLUpdateSetItem> items = updateStatement.getItems();
@@ -341,9 +348,7 @@
             if(i != 0){
                 splicingSql.append(",");
             }
-
             SQLUpdateSetItem item = items.get(i);
-
             //鏌ヨ鏀瑰瓧娈垫槸鍚﹂渶瑕佸姞瀵�
             aeskey = aesKeys.getOrDefault(item.getColumn().toString(),null);
 
@@ -354,7 +359,6 @@
                 splicingSql.append(item.getColumn()+" = "+fildValue);
             }
         }
-
         String sqlWhere = " WHERE";
         //鎶婂墿涓嬬殑鎷兼帴涓婃潵
         if(datas.length > 1){
@@ -425,6 +429,9 @@
         String[] datas = sql.split("WHERE",2);
 
         Map<String,String> aesKeys = aesKeysTable.get(insertName);
+        if(aesKeys == null){
+            return sql;
+        }
 
         splicingSql.append("DELETE FROM "+insertName);
 
diff --git a/src/main/java/com/hx/mybatis/aes/springbean/VariableAesKey.java b/src/main/java/com/hx/mybatis/aes/springbean/VariableAesKey.java
index 58185c0..b9dba4c 100644
--- a/src/main/java/com/hx/mybatis/aes/springbean/VariableAesKey.java
+++ b/src/main/java/com/hx/mybatis/aes/springbean/VariableAesKey.java
@@ -3,6 +3,8 @@
 import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
 import com.hx.common.annotations.MysqlHexAes;
 import com.hx.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -11,15 +13,21 @@
 import java.io.FileFilter;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.net.JarURLConnection;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 /**
  * 鑾峰彇鎸囧畾鍖呴噷闈㈢殑AES绉橀挜
  */
 @Component
 public class VariableAesKey {
+
+    //log4j鏃ュ織
+    private static Logger logger = LoggerFactory.getLogger(VariableAesKey.class.getName());
 
     @Resource
     private ConstantBean constantBean;
@@ -59,21 +67,22 @@
 
         isRun = 1;
         //椤圭洰鍚姩鐨勬椂鍊欏~鍏�
-        System.err.println("鎵弿鑾峰彇AES:" + constantBean.getPackPath());
+        logger.info("鎵弿鑾峰彇AES鐨勫寘:" + constantBean.getPackPath());
         AES_KEY = constantBean.getFixedAesKey();
         if(!StringUtils.isEmpty(constantBean.getPackPath())){
             Set<Class<?>> classes = classData(constantBean.getPackPath());
-
+            logger.info("鎵弿鑾峰彇AES鐨勫寘classes:" + classes.size());
             Map<String,String> aesKeysFild = new HashMap<>();
             boolean isAes = false;
             String tableName = null;
 
             for(Class<?> cl:classes){
                 //琛ㄥ悕绉�
-                Table table = cl.getAnnotation(Table.class);
-                if(table == null){
+                boolean hasAnnotation = cl.isAnnotationPresent(Table.class);
+                if(!hasAnnotation){
                     continue;
                 }
+                Table table = cl.getAnnotation(Table.class);
                 tableName = table.name();
 
                 aesKeysFild = new HashMap<>();
@@ -84,7 +93,7 @@
                 fields = getPatentFields(fields,cl);
                 for (Field field:fields) {
                     // 鍒ゆ柇鏂规硶涓槸鍚︽湁鎸囧畾娉ㄨВ绫诲瀷鐨勬敞瑙�
-                    boolean hasAnnotation = field.isAnnotationPresent(MysqlHexAes.class);
+                    hasAnnotation = field.isAnnotationPresent(MysqlHexAes.class);
                     if (hasAnnotation) {
                         // 鏍规嵁娉ㄨВ绫诲瀷杩斿洖鏂规硶鐨勬寚瀹氱被鍨嬫敞瑙�
                         MysqlHexAes mysqlHexAes = field.getAnnotation(MysqlHexAes.class);
@@ -121,37 +130,85 @@
 
     /**鑾峰彇鍖呬笅闈㈢殑鎵�鏈夋枃浠�*/
     public static Set<Class<?>> classData(String packPath){
-        Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
+        Set<Class<?>> classes = new LinkedHashSet();
+        String[] split = packPath.split(",|;");
+        String[] var3 = split;
+        int var4 = split.length;
 
-        //鎴彇
-        String[] packPaths = packPath.split(";|,");
-        for( String packageName : packPaths){
-            // 鏄惁寰幆杩唬
+        label82:
+        for(int var5 = 0; var5 < var4; ++var5) {
+            String pack = var3[var5];
             boolean recursive = true;
-            // 鑾峰彇鍖呯殑鍚嶅瓧 骞惰繘琛屾浛鎹�
-            String packageDirName = packageName.replace('.', '/');
-            // 瀹氫箟涓�涓灇涓剧殑闆嗗悎 骞惰繘琛屽惊鐜潵澶勭悊杩欎釜鐩綍涓嬬殑things
-            Enumeration<URL> dirs;
-            try{
-                dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
-                // 寰幆杩唬涓嬪幓
-                while (dirs.hasMoreElements()){
-                    // 鑾峰彇涓嬩竴涓厓绱�
-                    URL url = dirs.nextElement();
-                    // 寰楀埌鍗忚鐨勫悕绉�
-                    String protocol = url.getProtocol();
-                    // 濡傛灉鏄互鏂囦欢鐨勫舰寮忎繚瀛樺湪鏈嶅姟鍣ㄤ笂
-                    if ("file".equals(protocol)) {
-                        // 鑾峰彇鍖呯殑鐗╃悊璺緞
-                        String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
-                        // 浠ユ枃浠剁殑鏂瑰紡鎵弿鏁翠釜鍖呬笅鐨勬枃浠� 骞舵坊鍔犲埌闆嗗悎涓�
-                        findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
+            String packageName = pack;
+            String packageDirName = pack.replace('.', '/');
+
+            try {
+                Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
+
+                while(true) {
+                    label75:
+                    while(true) {
+                        if (!dirs.hasMoreElements()) {
+                            continue label82;
+                        }
+
+                        URL url = (URL)dirs.nextElement();
+                        String protocol = url.getProtocol();
+                        if ("file".equals(protocol)) {
+                            System.err.println("file绫诲瀷鐨勬壂鎻�:" + pack);
+                            String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
+                            findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
+                        } else if ("jar".equals(protocol)) {
+                            System.err.println("jar绫诲瀷鐨勬壂鎻�");
+
+                            try {
+                                JarFile jar = ((JarURLConnection)url.openConnection()).getJarFile();
+                                Enumeration entries = jar.entries();
+
+                                while(true) {
+                                    JarEntry entry;
+                                    String name;
+                                    int idx;
+                                    do {
+                                        do {
+                                            if (!entries.hasMoreElements()) {
+                                                continue label75;
+                                            }
+
+                                            entry = (JarEntry)entries.nextElement();
+                                            name = entry.getName();
+                                            if (name.charAt(0) == '/') {
+                                                name = name.substring(1);
+                                            }
+                                        } while(!name.startsWith(packageDirName));
+
+                                        idx = name.lastIndexOf(47);
+                                        if (idx != -1) {
+                                            packageName = name.substring(0, idx).replace('/', '.');
+                                        }
+                                    } while(idx == -1 && !recursive);
+
+                                    if (name.endsWith(".class") && !entry.isDirectory()) {
+                                        String className = name.substring(packageName.length() + 1, name.length() - 6);
+
+                                        try {
+                                            classes.add(Class.forName(packageName + '.' + className));
+                                        } catch (ClassNotFoundException var20) {
+                                            var20.printStackTrace();
+                                        }
+                                    }
+                                }
+                            } catch (IOException var21) {
+                                var21.printStackTrace();
+                            }
+                        }
                     }
                 }
-            }catch (IOException e){
-                e.printStackTrace();
+            } catch (IOException var22) {
+                var22.printStackTrace();
             }
         }
+
         return classes;
     }
 

--
Gitblit v1.8.0