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