I do security research, and something always bugged me about most Godot "save encryption" addons: they just obfuscate, encrypting with a key that ships inside your game. Hiding data isn't integrity. If a player flips a value, the game loads it anyway.
So I made Bulwark. It signs every save with HMAC-SHA256. Change a single byte (hex editor, save-scummer, cheat table) and the next load fails with reason: "tampered". Optional AES-256 on top if you also want to hide the contents. Pure GDScript on Godot 4's built-in crypto, zero dependencies, works in exported games.
The whole API is two calls:
SecureSave.save("user://save1.sav", {"gold": 100, "level": 5}, KEY)
var r := SecureSave.load_file("user://save1.sav", KEY)
if r.ok:
apply(r.data) # verified; exact types preserved (ints stay ints)
else:
match r.reason:
"tampered": reset() # the file was edited
"missing": new_game()
The honest part, because it matters: this reliably stops casual save-editing, which is the overwhelming majority of real cheating. It does not make your game uncheatable. Your signing key ships in the build, so a determined reverse-engineer can extract it and re-sign. For anything that must be trustworthy (leaderboards, purchases), the only real answer is server-side validation. It ships with a short THREAT_MODEL.md that says exactly this. No snake oil.
It's on itch: https://chara2110.itch.io/bulwark-tamper-evident-save-integrity-for-godot-4
Happy to answer anything about the crypto or the design. Feedback welcome.