Java 類檔案(.class)保留大量原始碼資訊(類名、方法名、欄位名、行號等),極易被反編譯工具(如 JD-GUI、Fernflower)還原為可讀性極高的原始碼,導致知識產權洩露、核心演算法外洩、安全邏輯被繞過等風險。混淆通過重命名符號、調整控制流、加密字串常量等手段,大幅提高逆向工程難度。
yGuard 是一款免費、開源、基於 Ant 的 Java 位元組碼混淆工具,特點:
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="lib/yguard.jar"/>
<target name="obfuscate">
<yguard>
<inoutpairs in="dist/app.jar" out="dist/app-obf.jar"/>
<shrink />
<optimize />
<rename mainclass="com.example.Main" logfile="obfuscate.log">
<keepclasses>
<class classes="com.example.api.**"/> <!-- 公開 API 保留原名 -->
<class classes="**/*Test*"/> <!-- 測試類保留 -->
</keepclasses>
<adjust /> <!-- 自動調整反射、序列化等 -->
</rename>
</yguard>
</target>
| 工具 | 授權 | 特色 | 適用場景 |
|---|---|---|---|
| ProGuard | GPL v2 / 商業 | 功能最全、社群最大、Android 官方預設 | Android、Java SE/EE、庫開發 |
| yGuard | BSD-like | Ant 原生、配置簡潔、免費商用 | 企業級 Java 專案、Ant/Maven 體系 |
| Zelix KlassMaster | 商業 | 流程控制混淆強、字串加密、GUI 設定 | 高安全需求、預算充足專案 |
| DashO | 商業 | 偵測竄改、運行時自我保護、整合 CI/CD | 金融、醫療、軍工等高安全領域 |
Main-Class、Servlet、Applet、JAX-RS 端點、Spring Bean、JNI 方法等不可混淆。Serializable 的類需保留 serialVersionUID 與欄位名,否則反序列化失敗。<keepclasses> 或註解 @Keep 保留動態載入的類。mapping.txt(或 obfuscate.log)是還原堆疊追蹤的關鍵,嚴禁外洩。yGuard 以免費、易整合、功能足夠成為眾多 Java 專案的首選混淆方案。配合 ProGuard 等工具對比評估,依專案安全等級與建構體系選擇最適工具,並建立「混淆→測試→發布」的標準化流程,才能真正守護代碼資產。