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