【问题标题】:in what format/file to store application data以什么格式/文件存储应用程序数据
【发布时间】:2016-03-26 04:32:50
【问题描述】:

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

tnx

【问题讨论】:

  • 为什么不加密你的xml文档呢? Encrypt XML_1Encrypt XML_2
  • 如果只是为了防止文件被篡改,你可以像this tutorial所示那样签名
  • 加密看起来比较混乱,如果我用二进制文件来存储用户信息呢????

标签: c# winforms


【解决方案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 等工具揭示整个加密代码。

如果您需要真正强大的加密,我建议您使用类似网络服务器的东西,它使用非对称加密对文件进行加密并保持私钥安全。这不会绝对阻止黑客读取文件,但至少会让您完全确定他无法修改其内容。

【讨论】:

  • tnx 回答 Diligent Key Presser,如何将文本存储在二进制文件中,然后读写该文件
  • 1.要生成良好的密钥,请使用 RNGCryptoServiceProvider Class 而不是 System.Random。 2. 这个答案将由临时攻击者提供,这可能就是你所需要的。但老练的攻击者将能够获取密钥并对 XML 文件进行更改。
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2019-01-11
  • 2010-10-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多