【发布时间】:2010-02-01 07:15:40
【问题描述】:
我有 c# program 和一个文件,它从中读写一些信息。我需要该用户不能更改该文件的内容,我需要某种方法来检查该文件是否正确(用户未更改)。有什么想法请写出来,一起讨论。 非常感谢
【问题讨论】:
-
文件及其副本有什么不同?校验和或CRC或哈希?还是其他?
我有 c# program 和一个文件,它从中读写一些信息。我需要该用户不能更改该文件的内容,我需要某种方法来检查该文件是否正确(用户未更改)。有什么想法请写出来,一起讨论。 非常感谢
【问题讨论】:
没有完全可靠的方法可以实现您想要的。如果你散列文件,用户可以修改文件并重新生成散列,然后你的程序会认为文件是未修改的。如果您尝试在注册表中隐藏哈希,用户可以轻松使用 SysInternals 工具来检测您将其保存到的位置。
您可以改为对文件进行数字签名,这类似于对其进行哈希处理,但它涉及密钥。但是,您再次遇到的问题是密钥必须保密,并且将其存储在应用程序或计算机上的某个位置使用户有可能找到密钥,然后他们再次能够修改文件并放弃它这样您的程序无法检测到修改。
您可以让您的应用程序将文件提交给您创建的 Web 服务,或者可能只是文件的哈希值以提高效率。 Web 服务可以对文件或散列进行数字签名,并返回签名或将其存储在服务器上。稍后当应用程序读取文件时,它可以使用签名和服务器的公钥(您必须从服务器获取此信息以确保文件已被服务器签名)来验证文件没有被更改。或者您可以将文件或哈希重新提交给服务器,如果服务器存储了签名,它可以验证文件并将结果返回给应用程序。同样,这不是完全证明。用户有办法欺骗 Web 服务,即使使用 SSL 也有办法规避这种情况。用户可以完全破解您的应用程序并删除验证码。
从您的其他问题来看,这是软件激活系统的某些组件。看看 Adobe 和 Microsoft,看看他们创建这样一个系统的失败尝试。如果你认为你可以做得更好,祝你好运。有更好的方法可以确保您的软件在没有激活系统的情况下合法使用,而激活系统只会让您的忠实用户感到沮丧。
【讨论】:
查看MD5 哈希算法。
【讨论】:
如果您只需要在 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
}
}
}
【讨论】:
您可以使用哈希来确保文件没有更改?
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")))
【讨论】:
您不能在他的文件系统中限制用户,但您的应用程序可以存储文件参数(创建和修改的时间戳、大小)并在其内容上创建哈希,以便在下次使用文件之前与这些值进行比较。
更新。
如果你想避免用户修改文件,你必须限制他访问它而不是阅读。所以你有两个选择:
【讨论】: