使用脚本加密密钥编译
发行游戏时,导出对话框为您提供了使用256位AES密钥加密脚本的选项。这样可以确保您的脚本不会以纯文本格式存储,并且不会被某些脚本小子轻易地剖析。当然,密钥需要存储在二进制文件中,但是如果对其进行了编译、优化并不带符号,则将需要一些努力才能找到它。
为此,您需要使用相同的密钥从源代码构建导出模板。
渐进式教程
生成一个十六进制的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
您可以生成密钥,而无需将输出重定向到文件,但这样能将暴露密钥的风险降到最低。
在控制台中将此键设置为环境变量,将用于编译Godot,如下所示:
Linux/macOS
Windows
export SCRIPT_AES256_ENCRYPTION_KEY="your_generated_key"
set SCRIPT_AES256_ENCRYPTION_KEY=your_generated_key
编译Godot导出模板,并在导出预设选项中将它们设置为自定义导出模板。
在导出预设的
脚本
选项卡中,设置加密密钥:- 导出项目。游戏现在应该使用加密脚本运行。
可能出现的错误
如果出现如下错误,这意味着密钥没有正确地包含在Godot构建中。Godot在导出过程中对脚本进行加密,但在运行时无法读取它们。
ERROR: open_and_parse: Condition ' String::md5(md5.digest) != String::md5(md5d) ' is true. returned: 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