Infinity Runner's Save Mechanic

So, because I was so proud of this, I may as well detail how this actually works, and what it is.
Infinity Runner is a game that I'm working on, which will have a global scoreboard as a major mechanic to the game.

The problem that I have found, is that people can cheat their scores, making it no fun for others.
I've managed to find a way to defeat this, but I'm focusing on the way I save the data/highscore to the system. Not the way I beat CheatEngine.

This following info is extremely complex, and intended for programmers to be reading, sorry if it doesn't make sense.

I decided that I wanted to use JSON for all my data going to the server, as that way it's a small POST that I use, rather than having a DB password and connection in the game executable. So, I looked into BSON (Binary JSON basically). I first looked at the JSON.NET library, and after some trial and error making it work on Wii U, I got a nice save file going. I have a type called Highscore, which has all the information that I need in it. It contains the score, the mode, the speed, date, the NNID, and a few more things I use to make sure that it hasn't been cheated.
Once the final collision has been detected, I read from a file called latest.bin, which is in the data director for the game, this is platform independant, so I have no worries about path problems. Even works on Wii U. If this file contains the initial data, overwrite it, and then close the file. In an async process, at the same time, a file called highest.bin is read from, and if the highest score in there is less than the current one, and the gamemode is the same, then overwrite it.
Now. This doesn't seem complex right?
I actually serialize the data into BSON in the beginning of each step, add a few security factors to it, I'll leave them unnamed, and then proceed on to the next step.
To read the score, I have to do the reverse.

As a gift, here's an example setup

public static byte[] ReadScore()  
    {
        string file = @Application.persistentDataPath + @"/latest.bin";
        if (File.Exists(file))
            return File.ReadAllBytes(file);
        else
        {
            Highscore hs = new Highscore
            {
                Score = 0,
                GameMode = GameMode.Infinite,
                Version = Convert.ToDouble(Application.version),
                NNID = "Initial_INFR"
            };
            byte[] data = BSONManager.Serialize(hs);
            using (BinaryWriter writer = new BinaryWriter(File.Open(file, FileMode.Create, FileAccess.Write, FileShare.Read)))
            {
                Debug.Log(file + "created");
                writer.Write(data);
                writer.Flush();
                return data;
            }
        }
    }