无法阻止用户修改文件。这是他们的电脑,所以他们可以随心所欲地使用(这就是为什么整个数字版权管理问题很困难的原因)。
由于您说您正在使用该文件来保存高分数,因此您有几个替代方案。请注意,正如之前所述,没有任何方法可以阻止一个非常坚决的攻击者篡改价值:由于您的应用程序正在用户计算机上运行,因此他可以简单地反编译它,查看您如何保护价值(获取任何在该过程中使用的秘密),并采取相应行动。但是,如果您愿意反编译应用程序,找出所使用的保护方案,并想出一个脚本/补丁来避开它,只为了改变只有您能看到的数字,那么,请去做吧?
混淆内容
这将防止用户直接编辑文件,但一旦混淆算法被知道,它就无法阻止用户进行编辑。
var plaintext = Encoding.UTF8.GetBytes("Hello, world.")
var encodedtext = Convert.ToBase64String(plaintext)
将密文保存到文件中,并在读取文件时反转此过程。
对内容进行签名
这不会防止用户编辑文件或查看其内容(但您不需要担心,高分并不是秘密),但您将能够检测到用户是否篡改了它。
var key = Encoding.UTF8.GetBytes("My secret key");
using (var algorithm = new HMACSHA512(key))
{
var payload = Encoding.UTF8.GetBytes("Hello, world.");
var binaryHash = algorithm.ComputeHash(payload);
var stringHash = Convert.ToBase64String(binaryHash);
}
将负载和哈希值都保存到文件中,然后在读取文件时检查保存的哈希值是否与新计算的哈希值匹配。您的密钥必须保密。
加密内容
利用.NET的加密库,在保存前对内容进行加密,读取文件时解密。
请谨慎使用以下示例,并花费适当时间理解每个步骤,再实现它(是的,您将为琐碎的原因使用它,但未来的您或其他人可能会用到它)。特别注意如何生成IV和密钥。
var iv = Convert.FromBase64String("9iAwvNddQvAAfLSJb+JG1A==");
var key = Convert.FromBase64String("UN8/gxM+6fGD7CdAGLhgnrF0S35qQ88p+Sr9k1tzKpM=");
using (var algorithm = new AesManaged())
}
}
ciphertext = memoryStream.ToArray();
}
using (var memoryStream = new MemoryStream(ciphertext))
}
}
}
}