我有一个应用程序需要一个安全的方式来存储它的配置。有些用户可以更改配置。我需要某种签名方案,在那里我可以验证配置文件没有改变出有效的用户。我曾考虑过使用RSA,其中私钥用用户密码加密,公钥用于签署配置。但是,没有什么可以阻止某人更改用户文件并添加他们自己的公钥,从而绕过我的安全。有任何想法吗?如何知道.NET C#中的文件是否已更改?
回答
你可以保持文件加密,只允许在你的应用程序中进行编辑。这将阻止用户从除您以外的任何工具编辑配置,这可以通过身份验证来验证用户是否为“有效用户”。
无法完全保护独立的客户端应用程序。唯一的方法是对文件执行校验和并将其验证到服务器。签名文件的方法并不比验证实际签名的方式重要。
保护客户端应用程序的开始是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");
}
}
事情是,如果我加密它,我必须保存磁盘的关键。所以他们可以更改文件和密钥。 – 2010-03-11 17:01:08
你可以嵌入密钥,混淆代码并希望获得最好的结果。问题是你没有外部的“安全”验证机制(例如:一台服务器),可以进行密钥交换,而不是。这将是主要问题。 – 2010-03-11 17:10:30
这些相矛盾:
- “我可以确认的是,配置文件没有用变出一个有效的用户”
- “没有什么可以阻止有人更改用户文件“
您应该首先找到一种方法来保护您的”用户文件“。通过用密钥加密,任何人都不能编辑(除了确定的饼干)或其他。然后你的RSA计划将会起作用。
但请注意,有一种方法可以保护完全在客户端上运行的应用程序,从确定的黑客程序中运行。
对于大多数应用程序,虽然,你不要需要完美的安全性。也许你应该先考虑一下你的应用程序有多少安全性“足够”。
如果,但是,需要完善的安全,那么你可能需要添加服务器端组件OR添加人类干预的过程中,例如具有管理员控制用户文件。
使用管理员密码加密“用户文件”。然后,每当有人想要更改用户文件时,需要管理员的同意。
好的,我该怎么做? – 2010-03-11 16:59:30
使用另一个硬编码/嵌入在您的应用程序中的RSA密钥对? – chakrit 2010-03-11 17:02:36
我想我会做的就是在办公室保留一个私钥(A)。我将用一个公共私人对(B)发送应用程序,并与我只知道的私人(A)签署。我将使用我公开的私人对(B)我发货在配置文件上签署一切。因此,将会有一组可验证的RSA密钥(B),这是不能改变的,因为用于验证它们的私钥(A)在办公室,并且公钥(A)是硬编码的。
在列出的所有方法中,密钥管理是客户机器上的真正弱点。密钥需要解密。使用另一个密钥来加密该密钥不会更强。混淆是一个开始。
我使用的是一个单独的程序集,它包含我们的加密代码。然后通过称为Steganography的技术存储密钥。我在应用程序的标识中编码密钥。然后使用已知的软件值对该密钥进行加密。在一种情况下,它可能是特定程序集的校验和。因此,任何对该文件做出任何更改的人都会破坏系统。这绝不是更安全,但它隐藏的细节。并将难度级别从临时性提高到确定性。然后,我通过混淆器和字符串加密器运行程序集。这会在尝试查看程序集时崩溃Reflector,从而导致更难以了解正在发生的事情。
这些策略的问题是,如果你附加一个调试器,那么你得到的数据是清晰的,因为你可以在加密/解密过程后将值存储在字符串中。为了解决这个问题,但不能消除,我使用了System.Security.SecureString类,并且不保留数据。
目标是打破反射器,停止使用.NET Framework解密数据的简单攻击,通过使用随机盐来停止字典攻击,允许通过URLEncoding加密缓冲区轻松进行字符串处理,正确使用初始化向量。
- 1. 知道文件的内容是否已经使用Node.js更改
- 2. 如何知道行是否已更新
- 3. 如何知道ckeditor的内容是否已更改
- 4. 如何知道.net事件是否已处理?
- 5. 如何知道iPhone用户SIM卡是否已更改?
- 6. 如何判断文件是否已通过.NET更改?
- 7. Flex:组件如何知道其样式之一是否已更改?
- 8. 如何知道用IntelliJ Idea修改的Scala文件是否已保存并且是否已签入CVS?
- 9. 如何知道MediaScanner是否已启用?
- 10. 如何知道AVAudioPlayer是否已暂停?
- 11. 如何知道用户是否已下载文件
- 12. 如何知道文件是否已经存在与Firefox iMacros
- 13. 如何知道表单是否已被修改
- 14. 如何知道是否一个std ::列表已被修改
- 15. C# - 监视是否属性只读任何文件已更改
- 16. 如何知道目录中是否没有进一步的更改? C#
- 17. 确定文件是否已更改
- 18. 如何从客户端知道表是否已更新
- 19. Android Studio如何知道图片是否已从Firebase更新?
- 20. 如何知道PHAsset是否被修改?
- 21. 如何知道Office的VBA组件是否已安装?
- 22. Windows窗体绑定问题:如何知道用户是否已更改值
- 23. 如何以编程方式知道Azure存储表是否已更改?
- 24. 如何知道文件名是否是Android中的别名?
- 25. 如何知道数组中的哪些数据已被更改?
- 26. 如何检查文件夹的内容是否已更改
- 27. C#WebClient.OpenRead如何知道eof是否?
- 28. 如何知道.NET
- 29. 如何知道JavaScript文件是否已包含在顶级页面中?
- 30. 如何使用DirtyKeys知道PFUser中的“email”字段是否已被修改?
当然,如果您使用的是非web应用程序,也应该使用obsfucation。 – 2010-03-11 16:55:41
事情是,如果我加密它,我必须将密钥保存到磁盘。所以他们可以更改文件和密钥。 – 2010-03-11 16:59:56
@Anthony D您不必将密钥保存到磁盘。有多种其他方法可将其嵌入到应用程序中。 – chakrit 2010-03-11 17:07:19