2010-03-11 122 views
2

我有一个应用程序需要一个安全的方式来存储它的配置。有些用户可以更改配置。我需要某种签名方案,在那里我可以验证配置文件没有改变出有效的用户。我曾考虑过使用RSA,其中私钥用用户密码加密,公钥用于签署配置。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而绕过我的安全。有任何想法吗?如何知道.NET C#中的文件是否已更改?

回答

4

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

+0

当然,如果您使用的是非web应用程序,也应该使用obsfucation。 – 2010-03-11 16:55:41

+0

事情是,如果我加密它,我必须将密钥保存到磁盘。所以他们可以更改文件和密钥。 – 2010-03-11 16:59:56

+0

@Anthony D您不必将密钥保存到磁盘。有多种其他方法可将其嵌入到应用程序中。 – chakrit 2010-03-11 17:07:19

0

无法完全保护独立的客户端应用程序。唯一的方法是对文件执行校验和并将其验证到服务器。签名文件的方法并不比验证实际签名的方式重要。

保护客户端应用程序的开始是Obfuscation。此后,您的加密将在下一行。

对于实际的签名,即使是一个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"); 
    } 
} 
+0

事情是,如果我加密它,我必须保存磁盘的关键。所以他们可以更改文件和密钥。 – 2010-03-11 17:01:08

+0

你可以嵌入密钥,混淆代码并希望获得最好的结果。问题是你没有外部的“安全”验证机制(例如:一台服务器),可以进行密钥交换,而不是。这将是主要问题。 – 2010-03-11 17:10:30

0

这些相矛盾:

  • “我可以确认的是,配置文件没有用变出一个有效的用户”
  • “没有什么可以阻止有人更改用户文件“

您应该首先找到一种方法来保护您的”用户文件“。通过用密钥加密,任何人都不能编辑(除了确定的饼干)或其他。然后你的RSA计划将会起作用。

但请注意,有一种方法可以保护完全在客户端上运行的应用程序,从确定的黑客程序中运行。

对于大多数应用程序,虽然,你不要需要完美的安全性。也许你应该先考虑一下你的应用程序有多少安全性“足够”。


如果,但是,需要完善的安全,那么你可能需要添加服务器端组件OR添加人类干预的过程中,例如具有管理员控制用户文件。

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

+0

好的,我该怎么做? – 2010-03-11 16:59:30

+0

使用另一个硬编码/嵌入在您的应用程序中的RSA密钥对? – chakrit 2010-03-11 17:02:36

0

我想我会做的就是在办公室保留一个私钥(A)。我将用一个公共私人对(B)发送应用程序,并与我只知道的私人(A)签署。我将使用我公开的私人对(B)我发货在配置文件上签署一切。因此,将会有一组可验证的RSA密钥(B),这是不能改变的,因为用于验证它们的私钥(A)在办公室,并且公钥(A)是硬编码的。

4

在列出的所有方法中,密钥管理是客户机器上的真正弱点。密钥需要解密。使用另一个密钥来加密该密钥不会更强。混淆是一个开始。

我使用的是一个单独的程序集,它包含我们的加密代码。然后通过称为Steganography的技术存储密钥。我在应用程序的标识中编码密钥。然后使用已知的软件值对该密钥进行加密。在一种情况下,它可能是特定程序集的校验和。因此,任何对该文件做出任何更改的人都会破坏系统。这绝不是更安全,但它隐藏的细节。并将难度级别从临时性提高到确定性。然后,我通过混淆器和字符串加密器运行程序集。这会在尝试查看程序集时崩溃Reflector,从而导致更难以了解正在发生的事情。

这些策略的问题是,如果你附加一个调试器,那么你得到的数据是清晰的,因为你可以在加密/解密过程后将值存储在字符串中。为了解决这个问题,但不能消除,我使用了System.Security.SecureString类,并且不保留数据。

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

相关问题