我有c#程序,以及它读写某些信息的文件。我需要该用户不能更改该文件的内容,我需要一些方法来解决该文件是正确的(不会被用户更改)。如果你有任何想法写,请一起讨论。 非常感谢c#,检查文件是否正确
回答
没有完成你想要什么完全可靠的方法。如果散列文件,用户可以修改该文件并重新生成散列,然后程序会认为文件未修改。如果您尝试在注册表中隐藏散列,用户可以使用SysInternals工具轻松检测您要保存的位置。
您可以改为对文件进行数字签名,这与对哈希进行哈希处理相似,除非涉及密钥。然而,您仍然有这样的问题,即密钥必须保密,并将其存储在应用程序中或计算机上的某个位置,以便用户找到密钥的可能性,然后再次修改该文件并将其辞职修改程序无法被您的程序检测到。
为了提高效率,您可以让应用程序将文件或文件的散列提交给您创建的Web服务。 Web服务可以对文件或散列进行数字签名,并返回签名或将其存储在服务器上。稍后当应用程序读取文件时,它可以使用签名和服务器的公钥(您必须从服务器获取该文件以确保该文件由服务器签名)以验证文件未被更改。或者,如果服务器存储了签名,您可以重新提交文件或散列给服务器,并且可以验证该文件并将结果返回给应用程序。再次,这不是全面的。即使使用SSL,也有办法规避这种情况,但用户可能会欺骗Web服务。用户可以完全破解你的应用程序并删除验证码。
从您的其他问题来看,这是软件激活系统的一些组件。只要看看Adobe和微软,以及他们尝试创建这样一个系统的失败。如果你认为你可以做得更好,祝你好运。有更好的方法可以确保您的软件合法使用,而不会导致令您的忠实用户感到沮丧的激活系统。
是的,你判断正确,我想为我的程序做一个演示。感谢您的回答,并请说更好的方法,我想最大限度地让我的忠实用户失望... – 2010-02-01 08:04:05
用户复制文件,有时与文件一起工作,然后替换复制的文件,并从零开始工作。我不想要这个。在文件中写入时间信息... – 2010-02-01 08:17:41
与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:42:33
查看MD5散列算法。
你不能限制用户在自己的文件系统,但您的应用程序可以存储文件参数(创建&修改的时戳,大小),并创建其内容的哈希,使与下一个文件之前使用这些值进行比较。
Upd。
如果你想避免用户修改文件,无论如何你必须限制他访问它,而不是阅读。所以你有两种选择:
- 使用安全授权并从ACL中删除用户。如果用户是管理员,那是一个坏主意。在其他情况下,如果可能的话,最好定义一些用户组。
- 使用数据库。这可以是只有高级用户可以修改的一些本地数据库,例如SQLite的。但是,这仅适用于一个假设,即用户无法打开此文件(不能安装适当的工具...)
计算文件checksum或crc或hash,并在文件本身的写出来的(计算在将它写出散列之前的散列)。 然后,当您加载文件时,检查是否存在此散列,将其移除并重新计算散列。确认它们匹配。如果他们不这样做,那么它就被篡改了。 只要您自己更改内容,请更新校验和/散列。
请记住,用户将能够修改文件并在文件中替换之后的散列,以防止检测到修改。 – AaronLS 2010-02-01 07:46:47
Thaks,但请参阅 用户复制文件,有时与文件一起使用,然后替换复制的文件,并从零开始工作。我不想要这个。在文件中写入时间信息... – 2010-02-01 07:52:41
与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:43:07
如果你只需要在只读在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
}
}
}
你可以使用一个哈希,以确保该文件没有改变?
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")))
- 1. 检查文件路径是否正确,但不检查文件是否存在
- 2. 检查nummer是否正确
- 3. 检查是否verfication代码是正确
- 4. 如何检查上传的文件格式是否正确?
- 5. 如何检查xml文件内容的格式是否正确?
- 6. 如何检查配置文件是否正确?
- 7. C++检查文件是否为空
- 8. C检查文件是否存在
- 9. 检查Excel文件是否为空C#
- 10. 如何使用gcc工具检查C++头文件是否正确?
- 11. 检查Pascal语法是否正确
- 12. 检查mmap的地址是否正确
- 13. 检查webview是否正确加载android
- 14. 检查ISBN号码是否正确
- 15. 检查输入密码是否正确
- 16. 检查字形是否呈现“正确”
- 17. 如何检查格式是否正确
- 18. 检查手机时钟是否正确
- 19. 检查答案是否正确
- 20. 检查PHP编码是否正确
- 21. 检查MIME类型是否正确?
- 22. 如何检查URL是否正确
- 23. 检查文件是否是C#中的媒体文件
- 24. 如何检查文件是否是C++中的常规文件?
- 25. 检查lineEdit输入是否有正确的格式Qt 5 C++
- 26. C++:检查一个单词是否拼写正确
- 27. 检查C中是否有正确的输入
- 28. 如何检查用户是否正确输入命令 - C#
- 29. 如何正确检查html文本框是否为空
- 30. 检查MySQL是正确的
与文件及其副本有什么不同? checksum或crc或hash?或其他? – 2010-02-01 08:42:01