以什么格式/文件来存储应用程序数据

时间:2016-03-26 04:32:50

标签: c# winforms

我有一个用c#语言开发的桌面应用程序,它有一些用户玩的游戏,App会在客户端计算机上存储他们的名字,分数和其他信息,目前我正在使用xml文件来存储信息。用户,但缺点是用户可以手动编辑文件,并通过编辑他们的分数或名称搞乱它。 我想存储信息,以便用户无法手动编辑它,因此我应该使用什么文件格式,还是应该在存储到文件之前加密数据。 我的文件存储在C:\ Users \ jobs \ AppData \ Local文件夹

TNX

1 个答案:

答案 0 :(得分:1)

如果您需要针对普通PC用户的一些基本保护,您可能希望使用非常简单的东西,例如:

// data for example
var data = new XElement("gamedata",
    new XElement("player", new XAttribute("name", "t0taln00b"),
        new XElement("score",
            new XAttribute("game", "bite your elbow"),
            new XAttribute("score", 9000),
            new XAttribute("progress", "19 %"))
        )
    );

// set up encryption.
// You probably will want to do this once at program startup and store Key and IV globally

var rnd = new Random(12562);
var keysize = 128;
byte[]
    Key = new byte[keysize / 8],
    IV = new byte[keysize / 8];
rnd.NextBytes(Key);
rnd.NextBytes(IV);

// lets encrypt

using (Aes aes = new AesManaged() { Padding = PaddingMode.PKCS7, KeySize = keysize })
{
    aes.Key = Key;
    aes.IV = IV;

    using (Stream file = new FileStream("save.xml.aes", FileMode.Create, FileAccess.Write))
    using (Stream encrypter = new CryptoStream(file, aes.CreateEncryptor(), CryptoStreamMode.Write))
        data.Save(encrypter);
}

//and decrypt

using (Aes aes = new AesManaged() { Padding = PaddingMode.PKCS7, KeySize = keysize })
{
    aes.Key = Key;
    aes.IV = IV;

    using (Stream file = new FileStream("save.xml.aes", FileMode.Open, FileAccess.Read))
    using (Stream decrypter = new CryptoStream(file, aes.CreateDecryptor(), CryptoStreamMode.Read))
    {
        var loaded = XElement.Load(decrypter);
        Console.WriteLine(loaded.ToString());
    }
}

请注意,这将是一个非常弱的加密。由System.Random生成的密钥不能很强大,并且可以使用.NET Reflector等工具显示整个加密代码。

如果您需要非常强大的加密功能,我建议您使用网络服务器,使用非对称加密对文件进行加密,并保护私钥的安全。这并不能完全阻止黑客阅读文件,但至少会让你完全确定他无法修改其内容。