2010-02-01 84 views
4

我有c#程序,以及它读写某些信息的文件。我需要该用户不能更改该文件的内容,我需要一些方法来解决该文件是正确的(不会被用户更改)。如果你有任何想法写,请一起讨论。 非常感谢c#,检查文件是否正确

+0

与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:42:01

回答

2

没有完成你想要什么完全可靠的方法。如果散列文件,用户可以修改该文件并重新生成散列,然后程序会认为文件未修改。如果您尝试在注册表中隐藏散列,用户可以使用SysInternals工具轻松检测您要保存的位置。

您可以改为对文件进行数字签名,这与对哈希进行哈希处理相似,除非涉及密钥。然而,您仍然有这样的问题,即密钥必须保密,并将其存储在应用程序中或计算机上的某个位置,以便用户找到密钥的可能性,然后再次修改该文件并将其辞职修改程序无法被您的程序检测到。

为了提高效率,您可以让应用程序将文件或文件的散列提交给您创建的Web服务。 Web服务可以对文件或散列进行数字签名,并返回签名或将其存储在服务器上。稍后当应用程序读取文件时,它可以使用签名和服务器的公钥(您必须从服务器获取该文件以确保该文件由服务器签名)以验证文件未被更改。或者,如果服务器存储了签名,您可以重新提交文件或散列给服务器,并且可以验证该文件并将结果返回给应用程序。再次,这不是全面的。即使使用SSL,也有办法规避这种情况,但用户可能会欺骗Web服务。用户可以完全破解你的应用程序并删除验证码。

从您的其他问题来看,这是软件激活系统的一些组件。只要看看Adobe和微软,以及他们尝试创建这样一个系统的失败。如果你认为你可以做得更好,祝你好运。有更好的方法可以确保您的软件合法使用,而不会导致令您的忠实用户感到沮丧的激活系统。

+0

是的,你判断正确,我想为我的程序做一个演示。感谢您的回答,并请说更好的方法,我想最大限度地让我的忠实用户失望... – 2010-02-01 08:04:05

+0

用户复制文件,有时与文件一起工作,然后替换复制的文件,并从零开始工作。我不想要这个。在文件中写入时间信息... – 2010-02-01 08:17:41

+0

与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:42:33

0

查看MD5散列算法。

0

你不能限制用户在自己的文件系统,但您的应用程序可以存储文件参数(创建&修改的时戳,大小),并创建其内容的哈希,使与下一个文件之前使用这些值进行比较。

Upd。

如果你想避免用户修改文件,无论如何你必须限制他访问它,而不是阅读。所以你有两种选择:

  1. 使用安全授权并从ACL中删除用户。如果用户是管理员,那是一个坏主意。在其他情况下,如果可能的话,最好定义一些用户组。
  2. 使用数据库。这可以是只有高级用户可以修改的一些本地数据库,例如SQLite的。但是,这仅适用于一个假设,即用户无法打开此文件(不能安装适当的工具...)
+0

好吧,很好,你理解我100%。但是,在哪里保存哈希结果?我尝试将它保存在注册表中>但是用户可以从注册表中复制该哈希结果,并且该文件会工作一段时间,然后将文件及其哈希粘贴到注册表并从零开始工作。我不想要这个... – 2010-02-01 07:26:14

+0

阅读我的答案。这不适合你吗? – psychotik 2010-02-01 07:37:01

+0

@Armen psychotik的回答涵盖此任务 – terR0Q 2010-02-01 07:40:45

5

计算文件checksumcrchash,并在文件本身的写出来的(计算在将它写出散列之前的散列)。 然后,当您加载文件时,检查是否存在此散列,将其移除并重新计算散列。确认它们匹配。如果他们不这样做,那么它就被篡改了。 只要您自己更改内容,请更新校验和/散列。

+1

请记住,用户将能够修改文件并在文件中替换之后的散列,以防止检测到修改。 – AaronLS 2010-02-01 07:46:47

+0

Thaks,但请参阅 用户复制文件,有时与文件一起使用,然后替换复制的文件,并从零开始工作。我不想要这个。在文件中写入时间信息... – 2010-02-01 07:52:41

+0

与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:43:07

0

如果你只需要在只读在C#中打开一个文件,你可以通过specfiying的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 
     } 
    } 
} 
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")))