以腳本加密密鑰進行編譯

在釋出遊戲時,匯出對話框中有可以使用 256 位元 AES 密鑰加密腳本的選項。通過該選項可以確保腳本不以純文字形式保存,且無法輕易地被一些腳本小子 (Script Kiddie) 輕鬆取得。當然,金鑰必須要保存在二進位檔中,但經過編譯、最佳化、並移除符號後,就需要花一點時間才能找到密鑰。

要加密腳本,需要以同一組密鑰來從原始碼編譯匯出腳本。

按部就班

  1. 產生十六進位格式的 256 位元 AES 密鑰。可以使用 這個服務 中的 AES-256-CBC 變體。

    或者,也可以通過 OpenSSL 來自行產生:

    openssl enc -aes-256-cbc -k secret -P -md sha1 > godot.gdkey
    

    該指令會將下列內容輸出至 godot.gdkey 檔案中:

    salt=5786FE8B91CA048A
    key=D2F90FCC4FCA64B8990F916EF5A73230C1841601D1EA06B2380EC0F530E4EF85
    iv =047C353AEC9E6C211515E3341BF9C61B
    

    產生密鑰時可以不將輸出重新導向輸出至檔案,這樣可以最小化密鑰暴露的風險。

  2. 將該密鑰在用來編譯 Godot 的主控台中設為環境變數,如:

    export SCRIPT_AES256_ENCRYPTION_KEY="your_generated_key"
    
    set SCRIPT_AES256_ENCRYPTION_KEY=your_generated_key
    
    $env:SCRIPT_AES256_ENCRYPTION_KEY="your_generated_key"
    
  3. 編譯 Godot 匯出樣板,並將該匯出樣板在匯出預設設定中設為自定匯出樣板。

  4. 在匯出預設設定中的 腳本 分頁設定加密密鑰:

    ../../_images/script_encryption_key.png
  5. 匯出專案。該遊戲現在應該會使用加密腳本來執行。

常見錯誤

若遇到類似下方的錯誤,這代表加密密鑰沒有被正確包含到 Godot 建置中。這代表 Godot 在匯出時有加密腳本,但執行階段無法讀取。

ERROR: open_and_parse: Condition "String::md5(md5.digest) != String::md5(md5d)" is true. Returning: ERR_FILE_CORRUPT
   At: core/io/file_access_encrypted.cpp:103
ERROR: load_byte_code: Condition ' err ' is true. returned: err
   At: modules/gdscript/gdscript.cpp:755
ERROR: load: Condition ' err != OK ' is true. returned: RES()
   At: modules/gdscript/gdscript.cpp:2135
ERROR: Failed loading resource: res://Node2D.gde
   At: core/io/resource_loader.cpp:279
ERROR: poll: res://Node2D.tscn:3 - Parse Error: [ext_resource] referenced nonexistent resource at: res://Node2D.gd
   At: scene/resources/scene_format_text.cpp:439
ERROR: load: Condition ' err != OK ' is true. returned: RES()
   At: core/io/resource_loader.cpp:202
ERROR: Failed loading resource: res://Node2D.tscn
   At: core/io/resource_loader.cpp:279
ERROR: Failed loading scene: res://Node2D.tscn
   At: main/main.cpp:1727
WARNING: cleanup: ObjectDB Instances still exist!
     At: core/object.cpp:2081
ERROR: clear: Resources Still in use at Exit!
   At: core/resource.cpp:425