【问题标题】:Spring Boot obfuscatorSpring Boot 混淆器
【发布时间】:2015-02-16 23:26:09
【问题描述】:

我正在使用带有 bootRepackage gradle 的 Spring Boot 来构建发布 jar 文件。我的项目需要在交付给客户之前对代码进行混淆。我尝试了 proguard 和其他一些工具,但出现了很多问题。我可以建议如何为 Spring Boot 配置此类工具。

我用这些配置尝试了 ProGuard

-injars  ./build/libs/webservice-1.0.jar
-outjars ./build/libs/webservice-obs-1.0.jar
-libraryjars <java.home>/lib/rt.jar
-keep class !myapplicationpackage.** { *; }
-keep class myapplicationpackage.Application { *; }

-ignorewarnings
-keepdirectories **
-dontshrink
-keepattributes *Annotation*

-keepclassmembers class com.yumyumlabs.** { java.lang.Long id; }
-keepnames class com.yumyumlabs.** implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}


-keepclassmembers class * { 
    @org.springframework.beans.factory.annotation.Autowired *; 
    @org.springframework.beans.factory.annotation.Qualifier *; 
    @org.springframework.beans.factory.annotation.Value *; 
    @org.springframework.beans.factory.annotation.Required *;
    @org.springframework.context.annotation.Bean *;
    @javax.annotation.PostConstruct *;
    @javax.annotation.PreDestroy *;
    @org.aspectj.lang.annotation.AfterReturning *;
    @org.aspectj.lang.annotation.Pointcut *;
    @org.aspectj.lang.annotation.AfterThrowing *;
    @org.aspectj.lang.annotation.Around *;
}
-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Controller class *
-keep @org.springframework.stereotype.Component class *
-keep @org.springframework.stereotype.Repository class *
-keep @org.springframework.cache.annotation.EnableCaching class *
-keep @org.springframework.context.annotation.Configuration class *
-keepattributes Signature

-dontwarn com.yumyumlabs.web.controllers.auth.AuthController



-dontwarn com.google.apphosting.api.ReflectionUtils
-dontwarn sun.misc.Unsafe




-dontwarn org.tartarus.snowball.**
-dontnote

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

但是生成的jar不能运行

java.lang.IllegalStateException: Unable to open nested entry 'lib/spring-boot-starter-web-1.2.0.RELEASE.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(Unknown Source)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(Unknown Source)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(Unknown Source)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(Unknown Source)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(Unknown Source)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(Unknown Source)
at org.springframework.boot.loader.Launcher.launch(Unknown Source)
at org.springframework.boot.loader.JarLauncher.main(Unknown Source)

【问题讨论】:

  • 请详细说明您的尝试和遇到的问题,以便我们帮助您解决这些问题。
  • 如果您有一个带有嵌套依赖项的 jar 并尝试使用 proguard 进行混淆,它会压缩嵌套的 jar 并且 spring boot loader 无法加载这些 jar,那么问题非常简单。
  • 您是否设法混淆了您的 Spring-Boot 应用程序?
  • 混淆复杂的java应用程序...我猜你选择了错误的编码语言!祝你好运,特别是如果你使用 JPA
  • 你想混淆什么?源代码?你不能混淆字节码,也不应该尝试。如果是源代码,请不要将源代码包含在 JAR 中。

标签: spring obfuscation


【解决方案1】:

它告诉你问题所在。它正在压缩不允许的嵌入 JAR 文件。您需要让它跳过子元素的压缩。可能最好完全跳过压缩。

真的,您可以跳过所有这些,因为这会使逆向工程变得更加困难,但不能阻止它。如果您真的需要保密,那么您唯一真正的选择是将您的应用程序作为服务出售,而不是提供 JAR、WAR、EAR 等。

IllegalStateException:无法打开嵌套的 条目“lib/spring-boot-starter-web-1.2.0.RELEASE.jar”。它已被压缩,嵌套的jar文件必须未经压缩存储。请检查用于创建可执行jar文件的机制

【讨论】:

    【解决方案2】:

    这可以通过重新打包未压缩的库来完成。这可以使用带有以下 bash 脚本的 jar 工具来完成。该脚本只需在项目主目录中执行即可。

    # some constant settings we use
    work_dir=work
    uncompress_dir=uncompress
    library_dir=lib
    
    # parameters for input and output files
    # the name of the library that should be uncompressed
    library_name="spring-boot-starter-web-1.2.0.RELEASE.jar"
    # the obfuscated artifact
    original_jar='webservice-obs-1.0.jar'
    # the new obfuscated artifact (can be the same)
    repacked_jar='webservice-obs-repack-1.0.jar'
    
    # build the obfuscated library
    mvn clean package -Dobfuscation
    
    # create working directory and copy obfuscated artifact
    mkdir target/$work_dir
    cp target/$original_jar target/$work_dir
    cd target/$work_dir
    
    # extract contents of obfuscated artifact
    jar xvf $original_jar
    rm $original_jar
    
    # uncompress the target library and jar again without compression (c0)
    mkdir $uncompress_dir
    mv $library_dir/$library_name $uncompress_dir
    cd $uncompress_dir
    jar xvf $library_name
    rm $library_name
    jar c0mf ./META-INF/MANIFEST.MF $library_name *
    mv $library_name ../$library_dir
    cd ..
    rm -r $uncompress_dir
    
    # jar the complete obfuscated artifact again
    # it is important here to copy the manifest as otherwise the library would not be executeable any more by spring-boot
    jar c0mf ./META-INF/MANIFEST.MF ../$repacked_jar *
    
    # cleanup work dir
    cd ..
    rm -r $work_dir
    

    如果更多文件需要这种特殊处理,您可能必须再次执行此操作。执行此操作的库之一是石英。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 2021-09-07
      • 2017-11-22
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多