Compilation avec une clé de cryptage des scripts¶
The export dialog gives you the option to encrypt your scripts with a 256-bit AES key when releasing your project. This will make sure your scripts are not stored in plain text and can not easily be ripped by some script kiddie.
Of course, the key needs to be stored in the binary, but if it's compiled, optimized and without symbols, it would take some effort to find it.
Pour que cela fonctionne, vous devez créer les modèles d'exportation à partir des sources, avec cette même clé.
Avertissement
This will not work if you use official, precompiled export templates. It is absolutely required to compile your own export templates to use PCK encryption.
Pas à pas¶
Generate a 256-bit AES key in hexadecimal format. You can use the aes-256-cbc variant from this service.
Alternatively, you can generate it yourself using OpenSSL command-line tools:
openssl rand -hex 32 > godot.gdkey
La sortie dans
godot.gdkey
devrait être similaire à :# NOTE: Do not use the key below! Generate your own key instead. aeb1bc56aaf580cc31784e9c41551e9ed976ecba10d315db591e749f3f64890f
Vous pouvez générer la clé sans rediriger la sortie vers un fichier, mais de cette façon, vous pouvez minimiser le risque d'exposer la clé.
Définissez cette clé comme variable d'environnement dans la console que vous utiliserez pour compiler Godot, comme ceci :
export SCRIPT_AES256_ENCRYPTION_KEY="your_generated_key"
set SCRIPT_AES256_ENCRYPTION_KEY=your_generated_key
$env:SCRIPT_AES256_ENCRYPTION_KEY="your_generated_key"
Compilez les modèles d'exportation Godot et définissez-les en tant que modèles d'exportation personnalisés dans les options d'exportation prédéfinies.
Set the encryption key in the Script tab of the export preset:
Exporter le projet. Le jeu devrait maintenant fonctionner avec des scripts cryptés.
Dépannage¶
Si vous obtenez une erreur comme ci-dessous, cela veut dire que cette clé n'a pas été proprement inclue dans votre compilation de Godot. Godot crypte les scripts durant l'exportation, mais ne peut pas les lire lors de l'exécution.
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