我有一个用c#语言开发的桌面应用程序,它有一些用户玩的游戏,App会在客户端计算机上存储他们的名字,分数和其他信息,目前我正在使用xml文件来存储信息。用户,但缺点是用户可以手动编辑文件,并通过编辑他们的分数或名称搞乱它。 我想存储信息,以便用户无法手动编辑它,因此我应该使用什么文件格式,还是应该在存储到文件之前加密数据。 我的文件存储在C:\ Users \ jobs \ AppData \ Local文件夹
中TNX
答案 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等工具显示整个加密代码。
如果您需要非常强大的加密功能,我建议您使用网络服务器,使用非对称加密对文件进行加密,并保护私钥的安全。这并不能完全阻止黑客阅读文件,但至少会让你完全确定他无法修改其内容。