Compilation avec une clé de cryptage des scripts

La boîte de dialogue d'exportation vous donne la possibilité de crypter vos scripts avec une clé AES 256 bits, lors de la livraison de votre jeu. Cela garantira que vos scripts ne sont pas stockés en texte brut et ne peuvent pas être facilement extraits par certains script kiddie. Bien sûr, la clé doit être stockée dans le binaire, mais si elle est compilée, optimisée et sans symboles, il faudrait un certain effort pour la trouver.

Pour que cela fonctionne, vous devez créer les modèles d'exportation à partir des sources, avec cette même clé.

Pas à pas

  1. Générer une clé AES 256 bits en HEXADÉCIMAL. Vous pouvez utiliser la variante aes-256-cbc de ce service.

    Vous pouvez également la générer vous-même en utilisant OpenSSL :

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

    Cela devrait produire le fichier "godot.gdkey" suivant :

    salt=5786FE8B91CA048A
    key=D2F90FCC4FCA64B8990F916EF5A73230C1841601D1EA06B2380EC0F530E4EF85
    iv =047C353AEC9E6C211515E3341BF9C61B
    

    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é.

  2. 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
    
  3. 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.

  4. Définissez la clé de chiffrement dans l’onglet Script du modèle (preset) d’exportation :

    ../../_images/script_encryption_key.png
  5. Exporter le projet. Le jeu devrait maintenant fonctionner avec des scripts cryptés.

Erreurs possibles

Si vous obtenez une erreur comme ci-dessous, cela veut dire que cette clé n'a pas été proprement inclue dans votre construction 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. 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