使用proguard进行javaweb代码混淆

背景:公司需要将软件打包出售,此时需要进行代码混淆和一些加密要求

调研:目前此类实现包含软件和硬件实现;硬件实现是使用类似加密狗usb工具进行防护,应用系统通过与加密狗交互,来判断用户使用的软件是否在有效期内。软件实现是使用加解密技术,本地校验或使用服务端校验,来满足授权的要求。但是以上两种方案,都存在问题,一旦用户有技术能力反编译java代码,则以上内容都是徒劳。于是在网上对于此类需求,主要由两种加固方案:1是代码混淆,2是使用加密技术对于java文件编译产生的class文件进行加密,并且使用自定义的classloader,将加密内容反解密并加载到jvm中。但是,不管如何防护,由于反解密的操作都是在客户端进行,都有被攻破的可能。同时还调研了第三方公司,对方目前对于linux下的springweb工程,尚未有安全的解决方案。

结论:我们现阶段采用proguard混淆代码,使代码可读性降低。同时考虑到spring编写的jar包,混淆后会产生各种问题,比如:1.jvmti相关问题,2. springboot载入混淆后的jar包之后,出现其他例如c3p0或threadpool包无法找到的问题,目前尚没有发现解决方案。所以:最终决定使用纯java project实现授权通信问题,形成客户端嵌入式jar包随应用一起发布,定期已约定的方案和授权服务端通信,来达到验证客户端授权的目的。

实践:目前已经实现了纯java project打包,并通过proguard混淆后,将此jar包发布在私服仓库,供即将销售的应用拉取。已验证拉取后的jar包是经过混淆的,并且入口方法可用。(入口方法所在的package类不要混淆,否则client无法知道如何调用)

计划:丰富客户端和授权服务端的实现,计划将此项目的代码开源在git上,待后续跟进。

目前的proguard采用gui的方式,混淆jar包,配置信息如下(尚未完全清理无用信息,仅作备份参考):

-injars permission-client-0.0.5.jar
-outjars permission-client-0.0.5_out.jar


-libraryjars 'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar'


-dontshrink
-dontoptimize
-printmapping 'proguard(jb51.net)\bin\proguard_print.txt'
-useuniqueclassmembernames
-keeppackagenames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
-dontpreverify
-dontwarn




-keep,allowshrinking class com.zbjk.aus.common.filter.*


# Keep - Applications. Keep all application classes, along with their 'main'
# methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}


# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver


# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
    public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}


# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
    native <methods>;
}


# Keep names - _class method names. Keep all .class method names. This may be
# useful for libraries that will be obfuscated again with different obfuscators.
-keepclassmembers,allowshrinking class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String,boolean);
}


-keep class com.zbjk.aus.common.filter.** { *; }




如果想保持某个类下面的方法也不要被混淆,需要配置以下内容


发布了32 篇原创文章 · 获赞 4 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览