如何知道.NET C#中的文件是否已更改?

如何知道.NET C#中的文件是否已更改?,c#,.net,encryption,rsa,digital-signature,C#,.net,Encryption,Rsa,Digital Signature,我有一个应用程序需要一种安全的方式来存储其配置。有些用户可以更改配置。我需要某种签名方案,以便在没有有效用户的情况下验证配置文件是否已更改。我曾考虑过使用RSA,其中私钥用用户密码加密,公钥用于对配置进行签名。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而规避我的安全性。有什么想法吗?您可以对文件进行加密,只允许在应用程序中进行编辑。这将阻止用户从您以外的任何工具编辑配置,该工具可以进行身份验证以验证用户是否为“有效用户”。无法完全保护独立客户端应用程序。唯一的方法是对文件进行

我有一个应用程序需要一种安全的方式来存储其配置。有些用户可以更改配置。我需要某种签名方案,以便在没有有效用户的情况下验证配置文件是否已更改。我曾考虑过使用RSA,其中私钥用用户密码加密,公钥用于对配置进行签名。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而规避我的安全性。有什么想法吗?

您可以对文件进行加密,只允许在应用程序中进行编辑。这将阻止用户从您以外的任何工具编辑配置,该工具可以进行身份验证以验证用户是否为“有效用户”。

无法完全保护独立客户端应用程序。唯一的方法是对文件进行校验和,并向服务器进行验证。签名文件的方法不如验证实际签名内容的方式重要

保护客户端应用程序的开始是。此后,下一步就是加密

对于实际签名,即使是
SHA
系列散列也可以完成这项工作。使用SHA512的示例如下所示:

FileStream fs = new FileStream(@"<Path>", FileMode.Open);

using (SHA512Managed sha512 = new SHA512Managed ())
{
    byte[] hash = sha512.ComputeHash(fs);

    string formatted = string.Empty;

    foreach (byte b in hash)
    {
         formatted += b.ToString("X2");
    }
}
FileStream fs=newfilestream(@“”,FileMode.Open);
使用(SHA512Managed sha512=新的SHA512Managed())
{
字节[]散列=sha512.ComputeHash(fs);
字符串格式=string.Empty;
foreach(散列中的字节b)
{
格式化+=b.ToString(“X2”);
}
}
这些矛盾:

  • “我可以验证配置文件没有在没有有效用户的情况下更改”
  • “没有任何东西可以阻止某人更改用户文件”
您应该首先找到保护“用户文件”的方法。通过使用密钥对其进行加密,任何人都无法进行编辑(确定的破解程序除外)或其他操作。然后你的RSA方案就可以工作了

但是,请注意,没有任何方法可以保护完全在客户端上运行的应用程序免受已确定的破解程序的攻击

但是,对于大多数应用程序,并不需要完美的安全性。也许您应该首先考虑对于您的应用程序来说,有多少安全性实际上是“足够的”


但是,如果您需要完美的安全性,那么您可能需要添加服务器端组件或在流程中添加人工干预,例如让管理员控制用户文件


使用管理员密码加密“用户文件”。然后,每当有人想要更改用户文件时,都需要管理员的同意。

我想我要做的是在办公室里保留一个私钥(a)。我将与一个公私对(B)一起发布应用程序,该对由只有我知道的私人(A)签名。我将使用我提供的公私对(B)对配置文件上的所有内容进行签名。因此,将有一组无法更改的可验证RSA密钥(B),因为用于验证它们的私钥(a)在办公室中,而公钥(a)是硬编码的。

在列出的所有方法中,密钥管理是客户端计算机上真正的弱点。解密需要密钥。使用另一个密钥对该密钥进行加密并没有更强的效果。混淆是一个开始

我使用的是一个单独的程序集,其中包含我们的加密代码。然后通过一种称为的技术存储密钥。我在应用程序的徽标中对密钥进行编码。然后使用软件的已知值对该密钥进行加密。在一种情况下,它可能是特定程序集的校验和。因此,任何对该文件进行任何更改的人都将破坏系统。这一点也不安全,但它完全是关于隐藏细节。把难度从随意提高到果断。然后,我通过混淆器和字符串加密器运行程序集。当试图查看部件时,这会使反射镜崩溃,因此更难了解发生了什么

这些策略的问题在于,如果附加了调试器,那么就可以清除数据,因为在加密/解密过程之后,可能会将值存储在字符串中。为了解决这个问题,但不是消除这个问题,我使用了这个类,并且没有保持数据的清晰


我们的目标是打破反射器,阻止仅使用.NET Framework解密数据的简单攻击,通过使用随机salt阻止字典攻击,通过对加密缓冲区进行URL编码,允许轻松处理字符串,正确使用初始化向量。

当然,如果你使用的是非网络应用,你也应该使用obsfaction。问题是,如果我加密它,我必须将密钥保存到磁盘。这样他们就可以更改文件和密钥。@Anthony D您不必将密钥保存到磁盘。有很多其他方法可以将它嵌入到你的应用程序中。我如何将它嵌入到应用程序中?@Anthony D这对于另一个问题来说已经足够了。试试谷歌,或者其中一个:/如果我加密它,我必须将密钥保存到磁盘。所以他们可以更改文件和密钥。你可以嵌入密钥,混淆代码,我想这是最好的。问题是,您没有可以进行密钥交换的外部“安全”验证机制(例如:服务器)。这将是主要问题。是否使用另一个硬编码/嵌入到应用程序中的RSA密钥对?