복붙노트

[SPRING] 스프링 부트 obfuscator

SPRING

스프링 부트 obfuscator

릴리스 jar 파일을 빌드하려면 bootRepackage gradle과 함께 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 cant run

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)

해결법

  1. ==============================

    1.그것은 당신에게 문제를 말하고 있습니다. 그것은 허용되지 않는 임베디드 JAR 파일을 압축합니다. 자식 요소의 압축을 건너 뛰려면이 파일을 가져와야합니다. 압축을 완전히 건너 뛰는 것이 가장 좋습니다.

    그것은 당신에게 문제를 말하고 있습니다. 그것은 허용되지 않는 임베디드 JAR 파일을 압축합니다. 자식 요소의 압축을 건너 뛰려면이 파일을 가져와야합니다. 압축을 완전히 건너 뛰는 것이 가장 좋습니다.

    리버스 엔지니어링을 조금 더 어렵게 만들었으므로 실제로 모든 것을 건너 뛸 수는 있지만 중지하지는 않습니다. 정말로 비밀로 유지해야하는 경우 JAR, WAR, EAR 등을 제공하는 대신 서비스로 서비스를 판매하는 것이 유일한 유일한 방법입니다.

    IllegalStateException : 중첩 항목 'lib / spring-boot-starter-web-1.2.0.RELEASE.jar'을 열 수 없습니다. 압축되고 중첩 된 jar 파일은 압축없이 저장해야합니다. 실행 가능한 jar 파일을 만드는 데 사용 된 메커니즘을 확인하십시오.

  2. ==============================

    2.이것은 압축되지 않은 라이브러리를 다시 포장하여 수행 할 수 있습니다. 다음 bash 스크립트로 jar 도구를 사용하여 수행 할 수 있습니다. 이 스크립트는 프로젝트 메인 디렉토리에서 실행되어야합니다.

    이것은 압축되지 않은 라이브러리를 다시 포장하여 수행 할 수 있습니다. 다음 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
    

    아마도 더 많은 파일에이 특별한 처리가 필요한 경우이 작업을 다시 수행해야 할 것입니다. 이를 수행하는 라이브러리 중 하나가 예를 들어 석영입니다.

  3. from https://stackoverflow.com/questions/27542110/spring-boot-obfuscator by cc-by-sa and MIT license