【问题标题】:c# , checking is file correctc#,检查文件是否正确
【发布时间】:2010-02-01 07:15:40
【问题描述】:

我有 c# program 和一个文件,它从中读写一些信息。我需要该用户不能更改该文件的内容,我需要某种方法来检查该文件是否正确(用户未更改)。有什么想法请写出来,一起讨论。 非常感谢

【问题讨论】:

  • 文件及其副本有什么不同?校验和或CRC或哈希?还是其他?

标签: c# file copy


【解决方案1】:

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

【讨论】:

  • 请记住,用户将能够修改文件并在之后替换文件中的哈希,以防止修改被检测到。
  • Thaks,但是,请参阅 user copy file ,有时与 file 一起使用,然后替换复制的 file ,并且从零开始工作。我不想要这个。在文件中写入时间信息...
  • 文件及其副本有什么不同?校验和或CRC或哈希?还是其他?
【解决方案2】:

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

您可以改为对文件进行数字签名,这类似于对其进行哈希处理,但它涉及密钥。但是,您再次遇到的问题是密钥必须保密,并且将其存储在应用程序或计算机上的某个位置使用户有可能找到密钥,然后他们再次能够修改文件并放弃它这样您的程序无法检测到修改。

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

从您的其他问题来看,这是软件激活系统的某些组件。看看 Adob​​e 和 Microsoft,看看他们创建这样一个系统的失败尝试。如果你认为你可以做得更好,祝你好运。有更好的方法可以确保您的软件在没有激活系统的情况下合法使用,而激活系统只会让您的忠实用户感到沮丧。

【讨论】:

  • 是的,你的判断是对的,我想为我的程序做一个演示。谢谢你的回答,请说更好的方法,我希望最大限度地让我的忠实用户失望......
  • 用户复制文件,有时与文件一起使用,然后替换复制的文件,并且从零开始工作。我不想要这个。在文件中写入时间信息...
  • 文件及其副本有什么不同?校验和或CRC或哈希?还是其他?
  • 企业一般不会使用非法软件,因为它会带来法律风险。对于演示,我会要求用户在通过提供的电子邮件提供下载链接之前在我的网站上注册并提供联系信息。演示期结束后,让您的销售部门与他们联系,询问他们是否有兴趣在试用期结束后购买该软件。
【解决方案3】:

查看MD5 哈希算法。

【讨论】:

    【解决方案4】:

    如果您只需要在 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】:

      您可以使用哈希来确保文件没有更改?

      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")))
      

      【讨论】:

        【解决方案6】:

        您不能在他的文件系统中限制用户,但您的应用程序可以存储文件参数(创建和修改的时间戳、大小)并在其内容上创建哈希,以便在下次使用文件之前与这些值进行比较。

        更新。

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

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

        【讨论】:

        • 好的,很好,你100%理解我。但是在哪里保存该哈希结果?我尝试将其保存在注册表中>但是用户可以从注册表复制该哈希结果,并且该文件可以工作一段时间,然后将文件及其哈希粘贴到注册表并从零开始工作。我不想要这个...
        • @Armen psychotik 的回答涵盖了这项任务
        • 用户复制文件,有时与文件一起使用,然后替换复制的文件,并且从零开始工作。我不想要这个。在文件中写入时间信息...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 2011-05-30
        • 2021-07-03
        • 2014-06-06
        • 2014-07-05
        • 1970-01-01
        • 2018-04-21
        相关资源
        最近更新 更多