Преглед изворни кода

增加功能:解密时,可从指定文件中读取密码
增加功能:解密时,可以指定shell的返回值为密码

邓沙利文 пре 3 година
родитељ
комит
31f6ad54d4
22 измењених фајлова са 186 додато и 327 уклоњено
  1. 0 298
      README.en.md
  2. 13 1
      README.md
  3. 1 1
      class-winter-core/pom.xml
  4. 6 1
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/Reverses.java
  5. 58 0
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/JavaagentCmdArgs.java
  6. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java
  7. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java
  8. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java
  9. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java
  10. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java
  11. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java
  12. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java
  13. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java
  14. 82 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java
  15. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java
  16. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java
  17. 5 5
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java
  18. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java
  19. BIN
      class-winter-core/src/test/resources/class-winter-core-2.4.0.jar
  20. 1 0
      class-winter-core/src/test/resources/password.txt
  21. 1 1
      class-winter-maven-plugin/pom.xml
  22. 1 1
      pom.xml

+ 0 - 298
README.en.md

@@ -1,298 +0,0 @@
-# 代码混淆之class-winter
-
-- [代码混淆之class-winter](#代码混淆之class-winter)
-  - [<font  face="幼圆" color = "#3399EA" >功能与特性</font>](#font--face幼圆-color--3399ea-功能与特性font)
-  - [<font  face="幼圆" color = "#3399EA" >加密</font>](#font--face幼圆-color--3399ea-加密font)
-  - [<font  face="幼圆" color = "#3399EA" >加密参数</font>](#font--face幼圆-color--3399ea-加密参数font)
-  - [<font  face="幼圆" color = "#3399EA" >解密(启动)</font>](#font--face幼圆-color--3399ea-解密启动font)
-  - [<font  face="幼圆" color = "#3399EA" >解密参数</font>](#font--face幼圆-color--3399ea-解密参数font)
-
----
-
-<font face="幼圆"  color = "#F53B45">**郑重声明**</font>
-
-&emsp;&emsp;[**class-winter**](https://gitee.com/JustryDeng/class-winter) 是本人在学习完 [**class-final(v1.1.9)**](https://gitee.com/roseboy/classfinal) 后,仿照class-final进行编写的,部分思路与class-final一致。
-
-## <font  face="幼圆" color = "#3399EA" >功能与特性</font>
-
-- 支持war加密。
-- 支持jar(普通jar+可执行jar)加密。
-- 支持xml加密(掩耳盗铃版)。
-
-## <font  face="幼圆" color = "#3399EA" >加密</font>
-
-- #### <font face="幼圆" ><font face="幼圆"  color = "#86CA5E">**方式一**</font>:通过maven插件自动加密。</font>
-  ```xml
-  <!--
-      class-winter插件
-      注:自Maven3.0.3起, 绑定到同一phase的Maven插件将按照pom.xml中声明的顺序执行
-      注:此插件最好放置在同一phase的最后执行。
-  -->
-  <plugin>
-      <groupId>com.idea-aedi</groupId>
-      <artifactId>class-winter-maven-plugin</artifactId>
-      <version>2.3.0</version>
-      <!-- 相关配置 -->
-      <configuration>
-          <!-- <finalName></finalName>-->
-          <includePrefix>加密范围</includePrefix>
-          <!-- <excludePrefix></excludePrefix>-->
-          <!-- <includeXmlPrefix></includeXmlPrefix>-->
-          <!-- <excludeXmlPrefix></excludeXmlPrefix>-->
-          <!-- <toCleanXmlChildElementName></toCleanXmlChildElementName>-->
-          <!-- <password></password>-->
-          <!-- <includeLibs></includeLibs>-->
-          <!-- <alreadyProtectedLibs></alreadyProtectedLibs>-->
-          <!-- <supportFile></supportFile>-->
-          <!-- <tips></tips>-->
-          <!-- <debug></debug>-->
-      </configuration>
-      <executions>
-          <execution>
-              <phase>package</phase>
-              <goals>
-                  <goal>class-winter</goal>
-              </goals>
-          </execution>
-      </executions>
-  </plugin>
-  ```
-  注:不必担心信息泄漏问题,使用此方式生成混淆的jar包时,会擦除pom.xml中关于class-winter-plugin的信息。
-
-- #### <font face="幼圆" ><font face="幼圆"  color = "#86CA5E">**方式二**</font>:通过 [**class-winter-core.jar**](https://gitee.com/JustryDeng/class-winter/raw/master/class-winter-core/src/test/resources/class-winter-core-2.3.0.jar) 主动加密。</font>
-
-  ```bash
-  java -jar class-winter-core-2.3.0.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
-  # 对于复杂的参数值,可以使用引号引起来
-  # linux
-  java -jar class-winter-core-2.3.0.jar k1='v1' k2='v2'
-  # windows
-  java -jar class-winter-core-2.3.0.jar k1="v1" k2="v2"
-  ```
-
-## <font  face="幼圆" color = "#3399EA" >加密参数</font>
-
-<table>
-  <tr align="center">
-    <td>参数</td>
-    <td>是否必填</td>
-    <td>说明</td>
-    <td>示例</td>
-  </tr>
-  <tr align="center">
-    <td>originJarOrWar</td>
-    <td>是</td>
-    <td>指定要加密的jar/war文件<br/>注:当使用maven插件进行自动加密时,无此参数。</td>
-    <td>originJarOrWar=/my-project.jar</td>
-  </tr>
-    <tr align="center">
-    <td>includePrefix</td>
-    <td>是</td>
-    <td>通过前缀匹配的形式定位要加密的class
-    <br/>
-注:多个通过逗号分割。</td>
-    <td>includePrefix=com
-    <br/>
-includePrefix=com,org</td>
-  </tr>
-    <tr align="center">
-    <td>excludePrefix</td>
-    <td>否</td>
-    <td>通过前缀匹配的形式排除class,不对其加密
-    <br/>
-注:多个通过逗号分割。
-<br/>
-注:excludePrefix优先级高于includePrefix。</td>
-    <td>excludePrefix=com.example.service,com.example.util.StrUtil.class</td>
-  </tr>
-      </tr>
-    <tr align="center">
-    <td>includeXmlPrefix</td>
-    <td>否</td>
-    <td>通过打出来的包中条目的entryName前缀匹配的形式定位要加密的xml
-    <br/>
-注:多个通过逗号分割。    
-    <br/>
-注:如果您打出来的加密包是准备作为一个lib包提供给第三方使用的,那么请不要使用此参数,因为解密时是不会解密项目所依赖的lib包中的xml的。</td>
-    <td>includeXmlPrefix=BOOT-INF/classes/
-    <br/>
-includeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/dao/</td>
-  </tr>
-  </tr>
-    <tr align="center">
-    <td>excludeXmlPrefix</td>
-    <td>否</td>
-    <td>通过打出来的包中条目的entryName前缀匹配的形式排除xml,不对其加密
-    <br/>
-注:多个通过逗号分割。</td>
-    <td>excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/
-    <br/>
-excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/dao/UserDao.xml</td>
-  </tr>
-  </tr>
-    <tr align="center">
-    <td>toCleanXmlChildElementName</td>
-    <td>否</td>
-    <td>加密xml中的哪些一级元素
-    <br/>
-注:默认值为resultMap,sql,insert,update,delete,select
-    <br/>
-注:多个通过逗号分割。</td>
-    <td>toCleanXmlChildElementName=select,delete,resultMap</td>
-  </tr>
-    <tr align="center">
-    <td>finalName</td>
-    <td>否</td>
-    <td>指定加密后生成的jar包名
-    <br/>
-注:若finalName与加密的包一致,那么生成的加密后的包会覆盖原来的包。</td>
-    <td>finalName=mine-project</td>
-  </tr>
-    <tr align="center">
-    <td>password</td>
-    <td>否</td>
-    <td>主动指定密码
-    <br/>
-注:密码不能包含空格和逗号。</td>
-    <td>password=123456</td>
-  </tr>
-    <tr align="center">
-    <td>includeLibs</td>
-    <td>否</td>
-    <td>指定将lib包也纳入加密范围内
-    <br/>
-注:多个通过逗号分割。
-<br/>
-注:lib中的class是否会被加密,还得由includePrefix和excludePrefix决定。</td>
-    <td>includeLibs=a.jar,b.jar</td>
-  </tr>
-    <tr align="center">
-    <td>alreadyProtectedLibs</td>
-    <td>否</td>
-    <td>指明项目所依赖的lib中,哪些lib本身就已经是被class-winter加密了的
-    <br/>
-注:多个通过逗号分割。
-<br/>
-注:主要用于处理第三方提供的由class-winter加密了的依赖包的场景。
-<br/>
-注:若lib需要密码,那么需要在指定lib的同时通过冒号接上密码。
-<br/>
-注:如果lib有密码,那么密码不能包含逗号。</td>
-    <td>alreadyProtectedLibs=a.jar,b.jar
-    <br/>
-alreadyProtectedLibs=a.jar,b.jar:pwd123
-<br/>
-alreadyProtectedLibs=a.jar:pwd1,b.jar:pwd2</td>
-  </tr>
-    <tr align="center">
-    <td>supportFile</td>
-    <td>否</td>
-    <td>指定一个加密辅助jar文件(或jar文件所在的目录)
-    <br/>
-注:当为目录时,该目录(含子孙目录)下的所有jar都会被作采集作为辅助文件。
-<br/>
-注:主要用于解决因ClassNotFound导致的加密失败问题。</td>
-    <td>supportFile=/abc.jar
-    <br/>
-supportFile=/libs</td>
-  </tr>
-    <tr align="center">
-    <td>tips</td>
-    <td>否</td>
-    <td>指定提示语。
-    <br/>
-注:当直接使用加密后的jar/war时,用到了加密了的类后,会先System.err.println输出此tips,然后System.exit退出程序。</td>
-    <td>windows示例:tips="请不要直接使用混淆后的jar/war"
-<br/>
-linux示例:tips='请不要直接使用混淆后的jar/war'</td>
-  </tr>
-    <tr align="center">
-    <td>debug</td>
-    <td>否</td>
-    <td>是否开启debug模式</td>
-    <td>debug=true</td>
-  </tr>
-</table>
-
-
-
-
-## <font  face="幼圆" color = "#3399EA" >解密(启动)</font>
-
-通过-javaagent指定代理进行解密启动。
-- #### <font  face="幼圆" color = "#86CA5E" >jar解密(启动)</font>
-  ```bash
-  # 假设your-project-encrypted.jar是由class-winter加密后的包,那么你可以这么启动
-  java -javaagent:/your-project-encrypted.jar -jar /your-project-encrypted.jar
-  # 也可以用class-winter-core-1.0.0.jar
-  # java -javaagent:/class-winter-core-1.0.0.jar -jar /your-project-encrypted.jar
-  # 或者指定参数
-  # java -javaagent:/your-project-encrypted.jar=debug=true,password=pwd12345 -jar /your-project-encrypted.jar
-  # 参数可以引起来(linux)
-  # java -javaagent:/your-project-encrypted.jar='debug=true,password=pwd12345' -jar /your-project-encrypted.jar
-  # 参数可以引起来(windows)
-  # java -javaagent:/your-project-encrypted.jar="debug=true,password=pwd12345" -jar /your-project-encrypted.jar
-  ```
-
-- #### <font  face="幼圆" color = "#86CA5E" >war解密(启动)</font>
-  > **以Tomcat9为例**
-  - linux方式一
-
-    编辑tomcat/bin/catalina.sh文件,在最上面加上
-
-    ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-1.0.0.jar=k1=v1,k2=v2
-    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-1.0.0.jar=debug=true";
-    export CATALINA_OPTS;
-    ```
-
-  - linux方式二
-
-    在tomcat/bin目录下创建setenv.sh文件,并写上
-
-    ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-1.0.0.jar=k1=v1,k2=v2
-    JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-1.0.0.jar=debug=true";
-    export JAVA_OPTS;
-    ```
-
-  - windows方式一
-
-    编辑tomcat/bin/catalina.bat文件,在@echo off后加上catalina参数
-
-    ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-1.0.0.jar=k1=v1,k2=v2
-    set CATALINA_OPTS="-javaagent:D:/class-winter-core-1.0.0.jar"
-    ```
-
-  - windows方式二
-
-    在tomcat/bin目录下创建setenv.bat文件,并写上
-
-    ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-1.0.0.jar=k1=v1,k2=v2
-    set JAVA_OPTS="-javaagent:D:/class-winter-core-1.0.0.jar"
-    ```
-
-## <font  face="幼圆" color = "#3399EA" >解密参数</font>
-
-<table>
-  <tr align="center">
-    <td>参数</td>
-    <td>是否必填</td>
-    <td>说明</td>
-    <td>示例</td>
-  </tr>
-  <tr align="center">
-    <td>password</td>
-    <td>否</td>
-    <td>指定解密密码</td>
-    <td>password=pwd123</td>
-  </tr>
-    <tr align="center">
-    <td>debug</td>
-    <td>否</td>
-    <td>是否开启debug模式</td>
-    <td>debug=true</td>
-  </tr>
-</table>

+ 13 - 1
README.md

@@ -31,7 +31,7 @@
   <plugin>
       <groupId>com.idea-aedi</groupId>
       <artifactId>class-winter-maven-plugin</artifactId>
-      <version>2.3.0</version>
+      <version>2.4.0</version>
       <!-- 相关配置 -->
       <configuration>
           <!-- <finalName></finalName>-->
@@ -288,6 +288,18 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     <td>否</td>
     <td>指定解密密码</td>
     <td>password=pwd123</td>
+  </tr>
+  <tr align="center">
+    <td>passwordFromFile</td>
+    <td>否</td>
+    <td>从指定文件中读取文本作为解密密码</td>
+    <td>passwordFromFile=/my-pwd-file.txt</td>
+  </tr>
+      <tr align="center">
+    <td>passwordFromShell</td>
+    <td>否</td>
+    <td>执行shell文件中的代码,并以其返货值作为解密密码</td>
+    <td>passwordFromShell=/my-pwd-file.shell</td>
   </tr>
     <tr align="center">
     <td>debug</td>

+ 1 - 1
class-winter-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.idea-aedi</groupId>
         <artifactId>class-winter</artifactId>
-        <version>2.3.0</version>
+        <version>2.4.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 6 - 1
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/Reverses.java

@@ -43,7 +43,12 @@ public class Reverses {
      */
     public static void premain(String args, Instrumentation instrumentation) {
         if (javaagentCmdArgs == null) {
-            javaagentCmdArgs = JavaagentCmdArgs.parseJavaagentCmdArgs(args);
+            try {
+                javaagentCmdArgs = JavaagentCmdArgs.parseJavaagentCmdArgs(args);
+            } catch (Exception e) {
+                Logger.error(Reverses.class,  ExceptionUtil.getStackTraceMessage(e));
+                System.exit(-1);
+            }
             // 是否启动debug,同步给Logger
             Logger.ENABLE_DEBUG.set(javaagentCmdArgs.isDebug());
         }

+ 58 - 0
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/JavaagentCmdArgs.java

@@ -3,6 +3,12 @@ package winter.com.ideaaedi.classwinter.util;
 import winter.com.ideaaedi.classwinter.author.JustryDeng;
 import winter.com.ideaaedi.classwinter.exception.ClassWinterException;
 
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 在使用class-winter进行解密时,如果不需要输入参数,那么可以直接java -javaagent:xxx.jar -jar xxx.jar
  * 如果需要传参,下面两种方式都可以
@@ -67,6 +73,32 @@ public class JavaagentCmdArgs {
         JavaagentCmdArgs instance = new JavaagentCmdArgs();
         for (String keyValue : keyValueArr) {
             keyValue = keyValue.trim();
+            // 读取指定文件中的内容作为password
+            if (keyValue.startsWith("passwordFromFile=")) {
+                String filepath = keyValue.substring("passwordFromFile=".length());
+                Logger.debug(JavaagentCmdArgs.class, "passwordFromFile -> " + filepath);
+                instance.setPassword(IOUtil.readContentFromFile(new File(filepath)).trim());
+                continue;
+            }
+            // 调用shell获取返回值作为password
+            if (keyValue.startsWith("passwordFromShell=")) {
+                String filepath = keyValue.substring("passwordFromShell=".length());
+                String shellContent = IOUtil.readContentFromFile(new File(filepath)).trim();
+                Logger.debug(JavaagentCmdArgs.class, "passwordFromShell -> " + shellContent);
+                List<String> shellResultList = runShell(shellContent);
+                String password;
+                if (shellResultList.size() == 0) {
+                    throw new IllegalArgumentException("There is not any result returned from shell. \n" + shellContent);
+                }
+                password = shellResultList.get(0).trim();
+                if (shellResultList.size() > 1) {
+                    Logger.debug(JavaagentCmdArgs.class, String.format("There is multi result returned from shell. \n shellResultList is %s. Use the first result '%s' as password.",
+                            shellResultList, password));
+                }
+                instance.setPassword(password);
+                continue;
+            }
+            // 直接获取password
             if (keyValue.startsWith("password=")) {
                 instance.setPassword(keyValue.substring("password=".length()));
                 continue;
@@ -77,4 +109,30 @@ public class JavaagentCmdArgs {
         }
         return instance;
     }
+    
+    /**
+     * 运行shell并获得结果
+     * <br />
+     * 注:如果sh中含有awk,一定要按new String[]{"/bin/sh","-c",shStr}写,才可以获得流
+     *
+     * @param shStr
+     *            需要执行的shell
+     * @return 结果
+     */
+    public static List<String> runShell(String shStr) {
+        List<String> strList = new ArrayList<>(4);
+        try {
+            Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", shStr}, null, null);
+            InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
+            LineNumberReader lineNumberReader = new LineNumberReader(inputStreamReader);
+            String line;
+            process.waitFor();
+            while ((line = lineNumberReader.readLine()) != null) {
+                strList.add(line);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Get result from shell error. \n" + shStr, e);
+        }
+        return strList;
+    }
 }

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java

@@ -73,7 +73,7 @@ public class AllTest {
         String tips = "方法已经被class-winter加密保护了,请不要直接使用java -jar xxx.jar启动项目,请使用java -javaagent:xxx.jar -jar xxx.jar启动项目.";
         String alreadyProtectedLibs = "encrypted-lib-have-pwd-1.0.0.jar:qwer123~";
         String debug = "true";
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java

@@ -67,7 +67,7 @@ public class AlreadyProtectedLibs_Test {
         String originJarOrWar = projectRootDir + Constant.LINUX_FILE_SEPARATOR + "my-project-with-encrypted-lib-no-pwd.jar";
         String includePrefix = "non-exist";
         String alreadyProtectedLibs = "encrypted-lib-no-pwd-1.0.0.jar";
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -110,7 +110,7 @@ public class AlreadyProtectedLibs_Test {
         String includePrefix = "non-exist";
         String alreadyProtectedLibs = "encrypted-lib-have-pwd-1.0.0.jar:qwer123~";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java

@@ -36,7 +36,7 @@ public class Debug_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -64,7 +64,7 @@ public class Debug_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java

@@ -38,7 +38,7 @@ public class ExcludePrefix_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.ssm.util.AesEncryptDecryptUtil,com.aspire.ssm.util.DbSecurityBeanUtil";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true
@@ -72,7 +72,7 @@ public class ExcludePrefix_Test {
         String includePrefix = "com.aspire.ssm.util.AesEncryptDecryptUtil,com.aspire.ssm.util.DbSecurityBeanUtil";
         String excludePrefix = "com.aspire.ssm.util.DbSecurityBeanUtil";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java

@@ -23,7 +23,7 @@ public class FinalName_Test {
         String includePrefix = "com";
         String finalName = "YiYaKaKa";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " finalName=" + finalName

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java

@@ -42,7 +42,7 @@ public class IncludeLibs_Test {
         String includePrefix = "org.springframework.aop.target.dynamic,com.google.common.xml";
         String includeLibs = "spring-aop-5.1.8.RELEASE.jar,guava-28.2-jre.jar";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " includeLibs=" + includeLibs

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java

@@ -39,7 +39,7 @@ public class IncludePrefix_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java

@@ -32,7 +32,7 @@ public class OriginJarOrWar_Test {
         String originJarOrWar = projectRootDir + "non-exist.jar";
         String includePrefix = "com.aspire.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true
@@ -58,7 +58,7 @@ public class OriginJarOrWar_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 82 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java

@@ -15,6 +15,17 @@ import winter.com.ideaaedi.classwinter.util.PathUtil;
 public class Password_Test {
     
     public static void main(String[] args) {
+        passwordTest();
+        // passwordFromFileTest();
+        
+        // 需要在linux上进一步验证
+        // passwordFromShellTest();
+    }
+    
+    /**
+     * 测试password
+     */
+    public static void passwordTest() {
         // 杀下进程(以保证端口没有被占用)
         BashUtil.killProcessByPorts("8080");
         
@@ -23,7 +34,7 @@ public class Password_Test {
         String includePrefix = "com";
         String password = "pwd123";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password
@@ -41,4 +52,74 @@ public class Password_Test {
         String javaagentArgs = "=debug=true,password=" + password;
         BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s -jar %s", encryptedJar, javaagentArgs, encryptedJar));
     }
+    
+    /**
+     * 测试 passwordFromFile
+     */
+    public static void passwordFromFileTest() {
+        // 杀下进程(以保证端口没有被占用)
+        BashUtil.killProcessByPorts("8080");
+        
+        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
+        String originJarOrWar = projectRootDir + "boot-jar.jar";
+        String includePrefix = "com";
+        String password = "pwd123";
+    
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
+                + " originJarOrWar=" + originJarOrWar
+                + " includePrefix=" + includePrefix
+                + " password=" + password
+                + " debug=" + true
+                ;
+        // 加密
+        BashUtil.runBashAndPrint(startBat);
+    
+    
+        String encryptedJar = originJarOrWar.replace(".jar", "-encrypted.jar");
+    
+        // 解密
+        // String javaagentArgs = "";
+        // String javaagentArgs = "=debug=true";
+        String filepath = projectRootDir + "password.txt";
+        String javaagentArgs = "=debug=true,passwordFromFile=" + filepath;
+        BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s -jar %s", encryptedJar, javaagentArgs, encryptedJar));
+    }
+    
+    /**
+     * 测试passwordFromShell (在linux上解密执行)
+     */
+    public static void passwordFromShellTest() {
+        // 杀下进程(以保证端口没有被占用)
+        BashUtil.killProcessByPorts("8080");
+        
+        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
+        String originJarOrWar = projectRootDir + "boot-jar.jar";
+        String includePrefix = "com";
+        String password = "pwd123";
+    
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
+                + " originJarOrWar=" + originJarOrWar
+                + " includePrefix=" + includePrefix
+                + " password=" + password
+                + " debug=" + true
+                ;
+        // 加密
+        BashUtil.runBashAndPrint(startBat);
+    
+        // 解密
+        /// String javaagentArgs = "";
+        /// String javaagentArgs = "=debug=true";
+        /*
+         * shell脚本内容简单示例:
+         *
+         * #!/bin/bash
+         * echo "pwd123"
+         */
+        String shellFilePath = "/pwd.shell";
+        String javaagentArgs = "=debug=true,passwordFromShell=" + shellFilePath;
+        /*
+         * 验证下面的启动指令前,需要将对应的pwd.shell、boot-jar-encrypted.jar文件放进linux的/目录下
+         */
+        System.err.println("请在linux上执行并进一步验证:" + String.format("java -javaagent:%s%s -jar %s", "boot-jar-encrypted.jar", javaagentArgs, "boot-jar-encrypted.jar"));
+    }
 }

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java

@@ -42,7 +42,7 @@ public class SupportFile_Test {
         String originJarOrWar = projectRootDir + "normal-jar.jar";
         String includePrefix = "com";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -62,7 +62,7 @@ public class SupportFile_Test {
         String includePrefix = "com";
         String supportFile = projectRootDir + "help";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " supportFile=" + supportFile

+ 3 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java

@@ -32,7 +32,7 @@ public class Tips_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -55,8 +55,8 @@ public class Tips_Test {
         String tips = "[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深...";
     
         // 如果tips值由一些特殊字符(如空格等)的话,可以用windows双引号(linux单引号)引起来。
-        // java -jar class-winter-core-2.3.0.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        // java -jar class-winter-core-2.4.0.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " tips=" + (BashUtil.IS_WINDOWS ? "\"".concat(tips).concat("\"") : "'".concat(tips).concat("'"));

+ 5 - 5
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java

@@ -34,7 +34,7 @@ public class War_Test {
         String originJarOrWar = projectRootDir + "war-project.war";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -62,7 +62,7 @@ public class War_Test {
         String includePrefix = "com";
         String password = "123456";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password
@@ -93,7 +93,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-no-pwd.jar";
         String password = "oop857857";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -124,7 +124,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-have-pwd.jar:qwer123~";
         String password = "yiyakaka";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -160,7 +160,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-have-pwd.jar:qwer123~";
         String debug = "true";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java

@@ -31,7 +31,7 @@ public class Xml_Test {
         String toCleanXmlChildElementName = "select";
         
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.3.0.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.4.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " includeXmlPrefix=" + includeXmlPrefix

BIN
class-winter-core/src/test/resources/class-winter-core-2.3.0.jar → class-winter-core/src/test/resources/class-winter-core-2.4.0.jar


+ 1 - 0
class-winter-core/src/test/resources/password.txt

@@ -0,0 +1 @@
+pwd123

+ 1 - 1
class-winter-maven-plugin/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.idea-aedi</groupId>
         <artifactId>class-winter</artifactId>
-        <version>2.3.0</version>
+        <version>2.4.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
pom.xml

@@ -9,7 +9,7 @@
     </modules>
     <groupId>com.idea-aedi</groupId>
     <artifactId>class-winter</artifactId>
-    <version>2.3.0</version>
+    <version>2.4.0</version>
 
     <!-- 配置项目的基础信息 -->
     <name>class-winter</name>