【发布时间】:2011-01-26 11:36:27
【问题描述】:
我有一个应用程序需要一种安全的方式来存储其配置。有些用户可以更改配置。我需要某种签名方案,我可以在其中验证配置文件在没有有效用户的情况下没有更改。我曾考虑过使用 RSA,其中私钥使用用户密码加密,公钥用于签署配置。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而绕过我的安全。有什么想法吗?
【问题讨论】:
标签: c# .net encryption rsa digital-signature
我有一个应用程序需要一种安全的方式来存储其配置。有些用户可以更改配置。我需要某种签名方案,我可以在其中验证配置文件在没有有效用户的情况下没有更改。我曾考虑过使用 RSA,其中私钥使用用户密码加密,公钥用于签署配置。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而绕过我的安全。有什么想法吗?
【问题讨论】:
标签: c# .net encryption rsa digital-signature
在列出的所有方法中,密钥管理是客户端计算机的真正弱点。解密需要密钥。使用另一个密钥来加密该密钥并不强。混淆是一个开始。
我使用的是一个单独的程序集,其中包含我们的加密代码。然后通过称为Steganography 的技术存储密钥。我将密钥编码在应用程序的徽标中。然后使用软件的已知值对该密钥进行加密。在一种情况下,它可能是特定程序集的校验和。因此,任何对该文件进行任何更改的人都会破坏系统。这绝不是更安全的,但它都是关于隐藏细节的。并将难度级别从随意提高到确定。然后,我通过混淆器和字符串加密器运行程序集。这会在尝试查看程序集时使 Reflector 崩溃,从而使其更难以了解正在发生的事情。
这些策略的问题在于,如果您附加了一个调试器,那么您就可以清楚地获得数据,因为您可以在加密/解密过程之后将值存储在一个字符串中。为了解决这个问题,但不是消除,我使用System.Security.SecureString 类并且不保持数据清晰。
目标是打破反射器,阻止仅使用 .NET Framework 解密数据的简单攻击,通过使用随机盐来阻止字典攻击,通过对加密缓冲区进行 URLEncoding 来轻松处理字符串,正确使用初始化向量.
【讨论】:
我想我要做的就是在办公室里保存一个私钥(A)。我将使用公共私有对 (B) 发布应用程序,并使用只有我知道的私有 (A) 签名。我将使用我发布的公共私有对(B)对配置文件上的所有内容进行签名。因此会有一组可验证的 RSA 密钥 (B),不能更改,因为用于验证它们的私钥 (A) 在办公室,而公钥 (A) 是硬编码的。
【讨论】:
这些矛盾:
您应该首先找到一种方法来保护您的“用户文件”。通过使用密钥对其进行加密,任何人都无法编辑(确定的破解者除外)或其他方式。然后你的 RSA 方案就可以工作了。
但请注意,没有方法可以保护完全在客户端上运行的应用程序免受确定的黑客攻击。
不过,对于大多数应用程序,您不需要需要完美的安全性。也许您应该首先考虑一下对于您的应用程序而言,实际上多少安全性“足够”。
但是,如果您需要完美的安全性,那么您可能需要添加服务器端组件或在流程中添加人工干预,例如让管理员控制用户文件。 p>
用管理员密码加密“用户文件”。然后每当有人要更改用户文件时,都需要管理员的同意。
【讨论】:
没有办法完全保护独立的客户端应用程序。唯一的方法是对文件进行校验和并将其验证到服务器。签署文件的方法不如验证实际签署的内容重要。
从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");
}
}
【讨论】:
您可以只对文件进行加密,并且只允许在您的应用程序中进行编辑。这将阻止用户从您以外的任何工具编辑配置,这些工具可以进行身份验证以验证用户是“有效用户”。
【讨论】: