# CC3.WebEasyObfus

![Static Badge](https://img.shields.io/badge/Version-1.0.4-blue) ![Static Badge](https://img.shields.io/badge/CocosCreator-3.8.x-green) ![Static Badge](https://img.shields.io/badge/Tested_On-web-yellow)


虽然 CC 在建置时已经做了些混淆，但为了不让有心人一键带走项目，进一步的保护就成了钢需。与此同时，开发团队的 "老板" 会预期这是简单勾勾、选选就完成事...，这就是 WebEasyObfus 要做的事。

> *「走過路過，別錯過，點顆星星，支持我！」*

> *（注：对插件的意见反馈请至 [Cocos 中文论坛](https://forum.cocos.org/t/topic/163849)。）*


## 安装方法

1. 下载项目成 ZIP 文件。

2. 解压后将内容复制到 `${your_project_path}/extensions/web-easy-obfus`。

3. 打开终端

     * 输入 `cd ${your_project_path}/extensions/web-zip-bundle`

         * 安装扩展依赖包 `npm install`

         * 构建扩展 `npm run build`

4. 到 Editor 菜单 Extension -> Extension Manager -> Installed 启用 `web-easy-obfus`。

>(*注：安装方法也可参考官方文档 [【扩展 安装与分享】](https://docs.cocos.com/creator/3.8/manual/zh/editor/extension/install.html) 。*)


## 如何使用

1. 到 Build Setting 新增 New Build Task 并选择平台 WebMobile/WebDesktop。到 Panel 中下拉找到 web-easy-obfus 选项。

    * Enable：启用或关闭功能。

    * Include All Bundle: 包含所有Bundle

        * 启用后，所有 Bundle 内的 JS 档案将进行混淆，否则只有 `assets/main/bundle.js` 下的JS档案将进行混淆。

    * Select Obfus Level：混淆分为五个等级，等级越高，混淆程度越彻底，但文件体积会增大，执行性能可能略受影响。

        * 基础 (Minimal)，對 javascript-obfuscator 設定分別為：

            ```javascript
            {
                // Minifies the output code to reduce file size.
                "compact": true, 
                // Disables converting code into a more complex control flow structure.
                "controlFlowFlattening": false,
                // Disables adding redundant dead code blocks. 
                "deadCodeInjection": false,
                // Keeps global variable names unchanged. 
                "renameGlobals": false,
                // Avoids extracting strings into a separate array for simplicity. 
                "stringArray": false 
            }
            ```

        * 标准 (Standard)，對 javascript-obfuscator 設定分別為：

            ```javascript
            {
                // Minifies the output code to reduce file size.
                "compact": true, 
                // Enables control flow flattening for added complexity.
                "controlFlowFlattening": true, 
                // Applies control flow flattening to 75% of the code.
                "controlFlowFlatteningThreshold": 0.75, 
                // Avoids injecting unnecessary dead code.
                "deadCodeInjection": false, 
                // Moves strings into a separate array for obfuscation.
                "stringArray": true, 
                // Applies string array obfuscation to 75% of strings.
                "stringArrayThreshold": 0.75 
            }
            ```

        * 增强 (Enhanced)，對 javascript-obfuscator 設定分別為：

            ```javascript
            {
                // Minifies the output code to reduce file size.
                "compact": true, 
                // Enables control flow flattening for added complexity.
                "controlFlowFlattening": true,
                // Applies control flow flattening to 90% of the code.
                "controlFlowFlatteningThreshold": 0.9,
                // Adds dead code to make reverse engineering harder.
                "deadCodeInjection": true,
                // Inserts dead code in 40% of places.
                "deadCodeInjectionThreshold": 0.4,
                // Keeps global variable names unchanged for compatibility.
                "renameGlobals": false, 
                // Moves strings into a separate array for obfuscation.
                "stringArray": true,
                // Encodes strings in the array using Base64.
                "stringArrayEncoding": ["base64"],
                // Applies string array obfuscation to 90% of strings.
                "stringArrayThreshold": 0.9,
                // Obfuscates object keys for added security.
                "transformObjectKeys": true 
            }
            ```

        * 安全 (Secure)，對 javascript-obfuscator 設定分別為：

            ```javascript
            {
                // Minifies the output code to reduce file size.
                "compact": true, 
                // Enables control flow flattening for added complexity.
                "controlFlowFlattening": true, 
                // Applies control flow flattening to all code.
                "controlFlowFlatteningThreshold": 1,
                // Adds dead code to make reverse engineering harder. 
                "deadCodeInjection": true, 
                // Inserts dead code in 50% of places.
                "deadCodeInjectionThreshold": 0.5, 
                // Renames global variables for better obfuscation.
                "renameGlobals": true,
                // Moves strings into a separate array for obfuscation. 
                "stringArray": true, 
                // Encodes strings in the array using RC4 encryption.
                "stringArrayEncoding": ["rc4"],
                // Applies string array obfuscation to all strings. 
                "stringArrayThreshold": 1, 
                // Obfuscates object keys for added security.
                "transformObjectKeys": true 
            }
            ```

        * 极致 (Ultimate)，對 javascript-obfuscator 設定分別為：

            ```javascript
            {
                // Minifies the output code to reduce file size.
                "compact": true, 
                // Enables control flow flattening for added complexity.
                "controlFlowFlattening": true, 
                // Applies control flow flattening to all code.
                "controlFlowFlatteningThreshold": 1, 
                // Adds dead code to make reverse engineering harder.
                "deadCodeInjection": true, 
                // Inserts dead code in all possible places.
                "deadCodeInjectionThreshold": 1, 
                // Renames global variables for better obfuscation.
                "renameGlobals": true,
                // Moves strings into a separate array for obfuscation. 
                "stringArray": true, 
                // Encodes strings using both Base64 and RC4 encryption.
                "stringArrayEncoding": ["base64", "rc4"], 
                // Applies string array obfuscation to all strings.
                "stringArrayThreshold": 1, 
                // Obfuscates object keys for added security.
                "transformObjectKeys": true, 
                // Converts characters to Unicode escape sequences for obfuscation.
                "unicodeEscapeSequence": true,
                // Replaces console output calls with empty functions to hide debugging messages. 
                "disableConsoleOutput": true 
            }
            ```


## CI/CD

本插件天然支持 CI/CD，只需從 Build Panel 导出当前平台的构建选项配置为 json 文件，用于[命令行构建](https://docs.cocos.com/creator/3.8/manual/zh/editor/publish/publish-in-command-line.html)。


## 参考文献

* [javascript-obfuscator](https://github.com/javascript-obfuscator/javascript-obfuscator)

* [Cocos Creator 官方的 UI 範例 GitHub：Cocos UI Example](https://github.com/cocos/cocos-example-ui)