├── docs ├── after_1016.png └── before_1016.png ├── README.md ├── .gitignore ├── src ├── main │ └── java │ │ └── me │ │ └── gv7 │ │ └── woodpecker │ │ ├── plugin │ │ └── WoodpeckerPluginManager.java │ │ └── helper │ │ ├── DruidPasswdDcrypter.java │ │ ├── PasswdDecryptHelper1.java │ │ └── PasswdDecryptHelper2.java └── test │ └── java │ └── DruidPasswordDecryptTest.java └── pom.xml /docs/after_1016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woodpecker-appstore/druid-decrypter/HEAD/docs/after_1016.png -------------------------------------------------------------------------------- /docs/before_1016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woodpecker-appstore/druid-decrypter/HEAD/docs/before_1016.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 0x01 简介 2 | 3 | druid-decrypter是一款用于解密druid加密过的数据库连接密码的woodpecker插件。目前支持druid `< 1.0.16`和`>= 1.0.16`两个版本范围的解密。 4 | 5 | ## 0x02 演示 6 | 7 | #### < 1.0.16 8 | 9 | ![](./docs/before_1016.png) 10 | 11 | #### >= 1.0.16 12 | 13 | ![](./docs/after_1016.png) 14 | 15 | ## 0x03 参考文献 16 | - [druid密码解密](https://mp.weixin.qq.com/s?__biz=MzkzNzE4MTk4Nw==&mid=2247483768&idx=1&sn=b09fde87bc62cc9f421cf00672553b0f) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Java template 3 | # Compiled class file 4 | *.class 5 | 6 | # Log file 7 | *.log 8 | 9 | # BlueJ files 10 | *.ctxt 11 | 12 | # Mobile Tools for Java (J2ME) 13 | .mtj.tmp/ 14 | 15 | # Package Files # 16 | *.jar 17 | *.war 18 | *.nar 19 | *.ear 20 | *.zip 21 | *.tar.gz 22 | *.rar 23 | 24 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 25 | hs_err_pid* 26 | target 27 | *.iml 28 | .idea 29 | .DS_Store 30 | -------------------------------------------------------------------------------- /src/main/java/me/gv7/woodpecker/plugin/WoodpeckerPluginManager.java: -------------------------------------------------------------------------------- 1 | package me.gv7.woodpecker.plugin; 2 | 3 | import me.gv7.woodpecker.helper.DruidPasswdDcrypter; 4 | 5 | public class WoodpeckerPluginManager implements IPluginManager { 6 | public void registerPluginManagerCallbacks(IPluginManagerCallbacks iPluginManagerCallbacks) { 7 | DruidPasswdDcrypter echoTextConverter = new DruidPasswdDcrypter(); 8 | iPluginManagerCallbacks.registerHelperPlugin(echoTextConverter); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/test/java/DruidPasswordDecryptTest.java: -------------------------------------------------------------------------------- 1 | import com.alibaba.druid.filter.config.ConfigTools; 2 | import org.junit.Test; 3 | 4 | public class DruidPasswordDecryptTest { 5 | @Test 6 | public void DruidBefore1016() throws Exception { 7 | String password = "hbZoFfr14R2yGuWJwbUtYdXjF40Df5sXbHSJYzGECsK0p1W4bmrM64SJKU0rmWo+yjUSrtU1Drb+0eGhQT3Xlg=="; 8 | System.out.println(ConfigTools.decrypt(password)); 9 | } 10 | 11 | @Test 12 | public void DruidAfter1016() throws Exception { 13 | String publickey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUAMHrATatXwODDAcHxfIcG6diYsw0l0Qfj/NJivHXMVs5JRYf4vao2nEXB+BxA3gHO0er3KiGpz2ieQjPgSF8CAwEAAQ=="; 14 | String password = "Q+zSOJytnRLmFHxB9YdFXlMnJj2y60r0Z11OFTRTOYQ/4kzKDWIU6AtFUv+DeVLuitKPGXGIkmalAXaoApOlzw=="; 15 | System.out.println(ConfigTools.decrypt(publickey, password)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/me/gv7/woodpecker/helper/DruidPasswdDcrypter.java: -------------------------------------------------------------------------------- 1 | package me.gv7.woodpecker.helper; 2 | 3 | import me.gv7.woodpecker.plugin.*; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class DruidPasswdDcrypter implements IHelperPlugin { 9 | public static IHelperPluginCallbacks callbacks; 10 | public static IPluginHelper pluginHelper; 11 | 12 | public DruidPasswdDcrypter() { 13 | } 14 | 15 | public void HelperPluginMain(IHelperPluginCallbacks iHelperPluginCallbacks) { 16 | callbacks = iHelperPluginCallbacks; 17 | pluginHelper = callbacks.getPluginHelper(); 18 | callbacks.setHelperPluginName("druid password Decrypt"); 19 | callbacks.setHelperPluginVersion("0.1.0"); 20 | callbacks.setHelperPluginAutor("cike,woodpecker-org"); 21 | callbacks.setHelperPluginDescription("解密druid加密的数据库链接字符串"); 22 | List helperList = new ArrayList(); 23 | helperList.add(new PasswdDecryptHelper1()); 24 | helperList.add(new PasswdDecryptHelper2()); 25 | callbacks.registerHelper(helperList); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | druid-decrypter 9 | 1.0 10 | 11 | 12 | 13 | com.alibaba 14 | druid 15 | 1.0.18 16 | 17 | 18 | 19 | me.gv7.woodpecker 20 | woodpecker-sdk 21 | 0.3.0 22 | provided 23 | 24 | 25 | 26 | 27 | junit 28 | junit 29 | 4.13 30 | test 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/java/me/gv7/woodpecker/helper/PasswdDecryptHelper1.java: -------------------------------------------------------------------------------- 1 | package me.gv7.woodpecker.helper; 2 | 3 | import com.alibaba.druid.filter.config.ConfigTools; 4 | import me.gv7.woodpecker.plugin.IArg; 5 | import me.gv7.woodpecker.plugin.IArgsUsageBinder; 6 | import me.gv7.woodpecker.plugin.IHelper; 7 | import me.gv7.woodpecker.plugin.IResultOutput; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | public class PasswdDecryptHelper1 implements IHelper { 14 | public PasswdDecryptHelper1() { 15 | } 16 | 17 | public String getHelperTabCaption() { 18 | return "Druid before 1.0.16"; 19 | } 20 | 21 | public IArgsUsageBinder getHelperCutomArgs() { 22 | IArgsUsageBinder argsUsageBinder = DruidPasswdDcrypter.pluginHelper.createArgsUsageBinder(); 23 | List args = new ArrayList(); 24 | IArg argPassword = DruidPasswdDcrypter.pluginHelper.createArg(); 25 | argPassword.setName("encrypt_password"); 26 | argPassword.setDefaultValue("hbZoFfr14R2yGuWJwbUtYdXjF40Df5sXbHSJYzGECsK0p1W4bmrM64SJKU0rmWo+yjUSrtU1Drb+0eGhQT3Xlg=="); 27 | argPassword.setDescription("解密key"); 28 | argPassword.setRequired(true); 29 | args.add(argPassword); 30 | argsUsageBinder.setArgsList(args); 31 | return argsUsageBinder; 32 | } 33 | 34 | public void doHelp(Map customArgs, IResultOutput iResultOutput) throws Throwable { 35 | String password = (String)customArgs.get("encrypt_password"); 36 | try { 37 | String content = ConfigTools.decrypt(password); 38 | iResultOutput.successPrintln("Decryt result:"); 39 | iResultOutput.rawPrintln("\n" + content + "\n"); 40 | } catch (Exception var6) { 41 | iResultOutput.errorPrintln(DruidPasswdDcrypter.pluginHelper.getThrowableInfo(var6)); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/me/gv7/woodpecker/helper/PasswdDecryptHelper2.java: -------------------------------------------------------------------------------- 1 | package me.gv7.woodpecker.helper; 2 | 3 | import com.alibaba.druid.filter.config.ConfigTools; 4 | import me.gv7.woodpecker.plugin.IArg; 5 | import me.gv7.woodpecker.plugin.IArgsUsageBinder; 6 | import me.gv7.woodpecker.plugin.IHelper; 7 | import me.gv7.woodpecker.plugin.IResultOutput; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | public class PasswdDecryptHelper2 implements IHelper { 14 | 15 | public String getHelperTabCaption() { 16 | return "Druid after 1.0.16"; 17 | } 18 | 19 | public IArgsUsageBinder getHelperCutomArgs() { 20 | IArgsUsageBinder argsUsageBinder = DruidPasswdDcrypter.pluginHelper.createArgsUsageBinder(); 21 | List args = new ArrayList(); 22 | IArg argKey = DruidPasswdDcrypter.pluginHelper.createArg(); 23 | argKey.setName("public_key"); 24 | argKey.setDefaultValue("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUAMHrATatXwODDAcHxfIcG6diYsw0l0Qfj/NJivHXMVs5JRYf4vao2nEXB+BxA3gHO0er3KiGpz2ieQjPgSF8CAwEAAQ=="); 25 | argKey.setDescription("解密key"); 26 | argKey.setRequired(true); 27 | args.add(argKey); 28 | IArg argStr = DruidPasswdDcrypter.pluginHelper.createArg(); 29 | argStr.setName("encrypt_password"); 30 | argStr.setDefaultValue("Q+zSOJytnRLmFHxB9YdFXlMnJj2y60r0Z11OFTRTOYQ/4kzKDWIU6AtFUv+DeVLuitKPGXGIkmalAXaoApOlzw=="); 31 | argStr.setDescription("要解密的密文,比如password"); 32 | argStr.setRequired(true); 33 | args.add(argStr); 34 | argsUsageBinder.setArgsList(args); 35 | return argsUsageBinder; 36 | } 37 | 38 | public void doHelp(Map customArgs, IResultOutput iResultOutput) throws Throwable { 39 | String key = (String)customArgs.get("public_key"); 40 | String str = (String)customArgs.get("encrypt_password"); 41 | 42 | try { 43 | String content = ConfigTools.decrypt(key, str); 44 | iResultOutput.successPrintln("Decryt result:"); 45 | iResultOutput.rawPrintln("\n" + content + "\n"); 46 | } catch (Exception var6) { 47 | iResultOutput.errorPrintln(DruidPasswdDcrypter.pluginHelper.getThrowableInfo(var6)); 48 | } 49 | } 50 | } 51 | --------------------------------------------------------------------------------