使用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.** { *; }




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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值