I've wondered how one would store data for games in a save/load system in Godot with little to no encryption. I think the best way is to create interdependency in the data structures, so if one part of the save file is tampered with then the whole thing is invalid.
Essentially, is there a way to create a checksum from multiple checksums. A Merkle Tree fits the role of calculating a checksum/hash from all component data. You could create a merkle tree for each category of data you want to save such as inventory, player progress, quests, etc. Now what if you took a partial checksum from a previous merkle tree and incorporated that into the next merkle tree, so now there is interdependence.
You could visualize it to be merkle tree (inventory) -> merkle tree (player progress) -> merkle tree (enemies) -> etc. A piece of the checksum from inventory is put into the player progress or you could just use the whole checksum. This means that if the save game file changes while the checksum file does not then it causes a data integrity failure. The root hashes do not need to be encrypted especially for a single player game.
ChatGPT can generate an implementation of a Merkle Tree, but you will have to stitch the whole Save/Load System together in GDScript. Serializing the data into binary, base64 encoding them and hashing them is valid. You will want to store the base64 encoded or binary values into the save game file. If any of that data is tampered with then at load time, the save game file is invalid to which the game could delete it as a recovery option.
You might as why have multiple merkle trees instead of one. I'd like to think that it helps with making the game more flexible for updates so the save game file isn't nuked. The save/load system would have to be versioned of course.
A good explanation of Merkle Trees: