`

springboot 使用proguard插件混淆代码

 
阅读更多

项目使用springboot开发,打war包部署。

使用maven导入ProGuard的插件,对代码进行混淆。

maven插件配置如下:

<!-- ProGuard混淆插件-->
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.2.0</version>
                <executions>
                    <execution>
                        <!-- 混淆时刻,这里是打包的时候混淆-->
                        <phase>package</phase>
                        <goals>
                            <!-- 使用插件的什么功能,当然是混淆-->
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <attach>true</attach>
                    <attachArtifactClassifier>pg</attachArtifactClassifier>
                    <!-- attach 的作用是在 install 与 deploy 时将生成的 pg 文件也安装与部署 -->
                    <options> <!-- 详细配置方式参考 ProGuard 官方文档 -->
                        <!--<option>-dontobfuscate</option>-->
                        <option>-ignorewarnings</option> <!--忽略所有告警-->

                        <!-- 不做收缩(删除注释、未被引用代码)-->
                        <option>-dontshrink</option>
                        <!-- 不做优化(变更代码实现逻辑)-->
                        <option>-dontoptimize</option>
                        <!-- 不路过非公用类文件及成员-->
                        <option>-dontskipnonpubliclibraryclasses</option>
                        <option>-dontskipnonpubliclibraryclassmembers</option>
                        <!--混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代-->
                        <option>-adaptclassstrings</option>
                        <!--不用大小写混合类名机制-->
                        <option>-dontusemixedcaseclassnames</option>

                        <!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
                        <option>-allowaccessmodification</option>
                        <!-- 确定统一的混淆类的成员名称来增加混淆-->
                        <option>-useuniqueclassmembernames</option>

                        <!--<option>-repackageclasses com.web.app.pg</option>-->
                        <!--平行包结构(重构包层次),所有混淆的类放在 pg 包下-->

                        <!-- 以下为 Keep,哪些内容保持不变,因为有一些内容混淆后(a,b,c)导致反射或按类名字符串相关的操作失效 -->

                        <option>-keep class **.package-info</option>
                        <!--保持包注解类-->

                        <option>-keepattributes Signature</option>
                        <!--JAXB NEED,具体原因不明,不加会导致 JAXB 出异常,如果不使用 JAXB 根据需要修改-->
                        <!-- Jaxb requires generics to be available to perform xml parsing and without this option ProGuard was not retaining that information after obfuscation. That was causing the exception above. -->
                        <!-- 需要保持的属性:异常,注解等-->
                        <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
                        <!--保持源码名与行号(异常时有明确的栈信息),注解(默认会过滤掉所有注解,会影响框架的注解)-->
                        <option>-keep class com.**.common.annotation.** { *;}</option>
                        <option>-keep class com.**.common.controller.** { *;}</option>
                        <option>-keep class com.**.common.aspect.** { *;}</option>
                        <option>-keep class com.**.common.config.** { *;}</option>
                        <option>-keep class com.**.common.task.** { *;}</option>
                        <option>-keep class com.**.activiti.config.** { *;}</option>
                        <option>-keep class com.**.oa.config.** { *;}</option>
                        <option>-keep class com.**.system.config.** { *;}</option>
                        <option>-keep class com.**.**.domain.** { *;}</option>
                        <option>-keep class com.**.**.dao.** { *;}</option>
                        <option>-keepclassmembers class * {
                            @org.springframework.beans.factory.annotation.Autowired *;
                            @org.springframework.beans.factory.annotation.Value *;
                            @org.springframework.stereotype.Service *;
                            @org.springframework.stereotype.Component *;
                            @org.springframework.scheduling.annotation.Scheduled *;
                            }
                        </option>
                        <option>-keep @org.springframework.boot.autoconfigure.SpringBootApplication class * {*;}</option>
                        <!--保持 Bean 类,(由于很多框架会对 Bean 中的内容做反射处理,请根据自己的业务调整) -->
                    </options>
                    <outjar>${project.build.finalName}-pg</outjar>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                    </libs>
                    <injar>classes</injar>
                </configuration>
            </plugin>

运行maven -clean,

然后运行maven -package,

在target包下会生成一个classes-pg.jar和项目名.war两个文件,

springboot如何打war包,可参考上篇文章。

 

问题:

1.由于在混淆后代码a.class,b.class,c.class等方式,会导致springboot注入bean的时候报bean冲突,需要对生成bean策略进行修改,添加类:

/**
 * sping下代码混淆后,不同包下的bean名相同会报bean冲突
 */
public class UniqueNameGenerator extends AnnotationBeanNameGenerator {
    @Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        //全限定类名
        String beanName = definition.getBeanClassName();
        return beanName;
    }
}

 在启动类添加注释:

@ComponentScan(nameGenerator = UniqueNameGenerator.class)

 

@ComponentScan(nameGenerator = UniqueNameGenerator.class)
public class StartApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的SpringBootStartApplication 启动类
        return builder.sources(StartApplication .class);
    }
}

 2.打包部署,该配置文件打包出来的war中classes文件仍然为正常代码,需要手动解压,将classes-pg.jar中classes替换进去。

 

注意:代码中如果包含反射类,不能进行代码混淆。

 

最后启动tomcat。

分享到:
评论

相关推荐

    SpringBoot + proguard+maven多模块实现代码混淆

    使用 proguard 混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。常用的应用场景是项目需要部署到客户机器上,一定程度上防止代码泄露。 springboot多maven工程结构:proguard-root 是顶级父工程,...

    springboot工程(单个maven工程)利用proguard实现代码混淆 java demo案例

    要在Spring Boot的Maven工程中使用ProGuard,我们需要添加`maven-proguard-plugin`插件到`pom.xml`文件中。配置大致如下: ```xml &lt;groupId&gt;com.github.wvengen&lt;/groupId&gt; &lt;artifactId&gt;proguard-maven-...

    springboot工程(单个maven工程)利用proguard实现代码混淆

    基于springboot搭建一个简单案例,利用proguard插件实现代码混淆,增加源代码的阅读和理解的难度, 并不能百分百保证代码安全。常用的应用场景是项目需要部署到客户机器上,一定程度上防止代码泄露。 ProGuard 是一个...

    通过proguard5.2.1代码混淆工具和简单说明

    本实例使用的是把web项目中的源码(src)所有文件打包成jar文件,使用proguard混淆后再把jar文件以及jar解压后的混淆class类文件替换原war项目的相应位置即可。 混淆过程中需要使用keep参数来保持原有一些属性、注解...

    MavenWEB项目使用ProGuard进行混淆,最佳解决方案.docx

    使用 ProGuard 插件可以对 WEB 项目进行混淆,保护代码的安全。 五、结论 本文介绍了如何使用 ProGuard 对 Maven WEB 项目进行混淆,解决了 WEB 项目中混淆的难题。文章详细介绍了 WEB 项目的结构和 Maven 配置...

    实现maven管理的Javaweb项目的proguard代码混淆功能

    本文将深入探讨如何在Maven管理的Java Web项目中集成ProGuard工具来实现代码混淆功能,以及在过程中可能遇到的问题及解决方案。 首先,让我们了解什么是ProGuard。ProGuard是一个开源的Java字节码混淆器、优化器和...

    J2EE-web工程ProGuard代码混淆

    【J2EE-web工程ProGuard代码混淆】是Java开发中的一种安全实践,旨在保护应用程序的源代码不被轻易反编译和理解。ProGuard是一款强大的Java字节码混淆、优化、压缩和预校验工具,它能将Java字节码转换成更难阅读和...

    一步步教你使用Proguard混淆Java源代码 .docx

    使用 Proguard 混淆 Java 源代码 Proguard 是一款功能强大且广泛使用的 Java bytecode 混淆工具,它可以保护 Java 代码免受反编译和逆向工程的攻击。下面将一步步指导如何使用 Proguard 混淆 Java 源代码。 1. ...

    proguard界面混淆版

    总之,ProGuard界面混淆版4.2为开发者提供了便捷的混淆工具,使得代码保护和优化变得更加容易。通过合理设置混淆规则,开发者可以有效提升应用的安全性和性能。然而,混淆并非万能,合理的安全措施应当结合其他手段...

    android proguard5.3.3混淆包

    android proguard5.3.3混淆包 替换Jar包以后使 混淆的类名方法名变成空白 使用方法 直接 替换 5.3.3版本的 混淆jar包 Mac 路径为 Contents/gradle/m2repository/net/sf/proguard/proguard-base Win gradle/m2...

    使用Proguard混淆Java源代码

    java代码很容易被反编译,可通过混淆技术来保护源码,此处我们应用开源项目proguard来进行混淆。操作使用详见:http://blog.csdn.net/odian1/article/details/8282799

    proguard程序混淆器

    ProGuard不仅仅是混淆器,它还进行代码优化,删除未使用的类、方法和字段,以及优化剩余的代码结构,使程序运行更高效。优化过程包括去除冗余的指令、合并常量等,从而减小程序大小,加快加载速度。 3. **压缩** ...

    Android 4.0及以上版本 ProGuard 代码混淆

    ProGuard 是一款广泛应用于 Android 开发中的代码混淆工具,它能够通过删除未使用的类、字段、方法等,从而缩小 APK 的体积,并提高应用运行速度。此外,ProGuard 还能为类、字段、方法等命名,使得反编译后的代码...

    Proguard混淆Web项目(Spring+Struts2+Mybatis)

    "Proguard混淆Web项目(Spring+Struts2+Mybatis)"是一个针对这类需求的实践案例,它利用了Proguard这一强大的代码混淆、优化和压缩工具。下面我们将深入探讨Proguard的相关知识点及其在Web项目中的应用。 Proguard...

    java代码混淆工具proguard及教程讲解

    java代码混淆工具 简单使用docx 字典文件 生成的配置示例

    proguard4.4混淆器

    对于Android开发,ProGuard与R8混淆器一起使用,R8是Google推出的新一代代码混淆工具,速度更快,但ProGuard 4.4在某些特定场景下仍然有其价值。 在实际使用ProGuard 4.4时,需要注意以下几点: - **保留关键类和...

    proguard混淆打包工具

    proguard混淆打包工具proguard混淆打包工具proguard混淆打包工具

    Java防编译技术---proguard混淆器

    Java防编译技术是开发过程中保护源代码安全性和技术保密性的重要手段,而ProGuard混淆器正是其中的关键工具。ProGuard是一款开源的Java字节码混淆、优化、压缩和预校验工具,它能帮助开发者有效地减少应用的体积,...

    如何混淆Android项目代码(ProGuard)防止反编译.rar

    本教程将深入探讨如何使用ProGuard来混淆Android项目代码,以防止反编译。 一、ProGuard介绍 ProGuard是一款免费的Java类文件 shrinker、optimizer、obfuscator 和 preverifier。它能够减小APK大小,优化字节码,...

Global site tag (gtag.js) - Google Analytics