WAR 包本質是 ZIP,包含編譯後的 `.class` 文件。攻擊者獲取 WAR 後,可用 JD-GUI、Fernflower、CFR、Procyon 等反編譯工具還原接近源碼的 Java 代碼,導致核心業務邏輯、加密算法、API 金鑰洩露。
將可讀的類名、方法名、變量名重命名為無意義字符(`a`、`b`、`c`),打亂控制流,移除調試信息(行號、局部變量表)。
| 工具 | 特點 | 集成方式 |
|---|---|---|
| ProGuard | 官方推薦、免費、Gradle/Maven 原生支持 | `build.gradle` 配置 `minifyEnabled true` + `proguard-rules.pro` |
| DexGuard | ProGuard 商業版、針對 Android 深度優化、字符串加密、類加密 | 商業授權,Gradle 插件 |
| ZKM (Zelix KlassMaster) | 老牌商業混淆器、流程控制混淆強、字符串加密 | Ant/Maven 插件 |
| Stringer Java Obfuscation | 專注字符串/資源加密、反調試、水印 | Maven/Gradle 插件 |
-dontoptimize # 關閉優化(避免部分庫兼容性問題)
-dontobfuscate # 若僅壓縮不混淆
-keepattributes SourceFile,LineNumberTable # 保留行號便於崩潰定位
-keep class com.yourpkg.api.** { *; } # 保留接口類不混淆 (反射調用)
-keep class * implements java.io.Serializable { *; }
-keepclassmembers enum * { *; }
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *; # Spring 注入字段
}
將核心加密、簽名、風控算法用 C/C++ 實現,編譯為 `.so` (Linux/Android) 或 `.dll` (Windows),Java 通過 JNI 調用。
✅ 逆向難度指數級上升(需懂匯編、IDA Pro)。
⚠️ 跨平台編譯維護成本高、JNI 調用有性能開銷。
| 場景 | 推薦方案 | 成本 |
|---|---|---|
| 普通企業應用 | ProGuard + 配置中心外部化密鑰 | 低 (免費、幾小時接入) |
| 金融/支付/醫療核心系統 | ProGuard/DexGuard + 關鍵模塊 JNI + 運行時完整性校驗 | 中高 |
| 商業化 SDK 輸出 | DexGuard/Stringer + 類加載器加密 + 反調試 + 水印追蹤 | 高 (商業授權) |
「混淆提高逆向成本,外部化消除靜態洩露,原生化改變逆向賽道,運行時防篡改,物理隔離縮小攻擊面」。沒有絕對安全,只有不斷提高攻擊者的 ROI(投入產出比),使其放棄或轉向更軟目標。ProGuard + 配置中心是性價比最高的起步組合,建議所有生產 WAR 必開啟。