我有c#程序,还有一个文件,它从中读取一些信息。我需要用户无法更改该文件的内容,我需要一些方法来确定该文件是否正确(不会被用户更改)。如果您有任何想法,请一起讨论。 非常感谢
答案 0 :(得分:5)
计算文件checksum或crc或hash并将其写在文件本身中(在将其写出哈希值之前计算哈希值)。 然后在加载文件时,检查是否存在此哈希,将其删除并重新计算哈希值。验证它们是否匹配。如果他们不这样做,那么它就被篡改了。 无论何时自己更改内容,都要更新校验和/哈希。
答案 1 :(得分:2)
没有完全可靠的方法来完成你想要的东西。如果您对文件进行哈希处理,则用户可以修改该文件并重新生成哈希值,然后您的程序会认为该文件未经修改。如果您尝试在注册表中隐藏哈希,用户可以轻松使用SysInternals工具来检测您将其保存到的位置。
您可以改为对文件进行数字签名,这类似于对其进行散列,但它涉及一个密钥。但是,您仍然遇到密钥必须保密的问题,并将其存储在应用程序或计算机上的某个位置,这样用户就有可能找到密钥,然后他们又可以修改文件并将其重新签名。您的程序无法检测到修改。
您可以让您的应用程序向您创建的Web服务提交文件,或者可能只提供文件的哈希以提高效率。 Web服务可以对文件或散列进行数字签名,并返回签名或将其存储在服务器上。稍后当应用程序读取文件时,它可以使用签名和服务器的公钥(您必须从服务器获取此信息以确保文件已由服务器签名)以验证文件是否未更改。或者,如果服务器存储了签名,您可以将文件或哈希重新提交给服务器,它可以验证文件并将结果返回给应用程序。同样,这不是完全的。用户可以通过多种方式欺骗Web服务,即使使用SSL也有办法绕过它。用户可以完全破解您的应用程序并删除验证码。
从您的其他问题来看,这是软件激活系统的一部分。只需看看Adobe和Microsoft,以及他们创建这样一个系统的失败尝试。如果你认为你可以做得更好,祝你好运。有更好的方法可以确保您的软件在没有激活系统的情况下合法使用,只会导致您的忠实用户受挫。
答案 2 :(得分:0)
查看MD5哈希算法。
答案 3 :(得分:0)
您不能在其文件系统中限制用户,但您的应用程序可以存储文件参数(创建和修改的时间戳,大小)并在其内容上创建哈希,以便在下次文件使用之前与这些值进行比较。
<强> UPD。强>
如果你想避免用户修改文件无论如何你必须限制他访问它而不是阅读。所以你有2个选择:
答案 4 :(得分:0)
如果您只需要在C#中以只读方式打开文件,则可以通过指定FileAccess.Read标志来执行此操作:
using (FileStream fs1 = new FileStream(path, FileMode.Open, FileAccess.Read))
{
using (StreamReader rd1 = new StreamReader(fs1))
{
while ((str = rd1.ReadLine()) != null)
{
//do stuff
}
}
}
答案 5 :(得分:0)
您可以使用哈希来确保文件没有更改吗?
public static void Main(string[] args)
{
using (HashAlgorithm hashAlg = new SHA1Managed())
{
using (Stream file = new FileStream("C:\\test.txt", FileMode.Open, FileAccess.Read))
{
byte[] hash = hashAlg.ComputeHash(file);
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
或
BitConverter.ToString(MD5.Create().ComputeHash(File.ReadAllBytes("C:\\test.txt")))