如何在.NET应用程序中隐藏加密密钥?

时间:2009-03-06 18:31:44

标签: c# database security encryption obfuscation

我正在开发一个内部网应用程序(C#),它使用我们想保密的一些数据(Web服务器本地)。使用旧数据存储库对此数据进行加密(AES)。我们不能完全阻止对机器的物理访问。

显然,我们永远不会在这里拥有完美的安全性。但是,我们希望尽可能让任何人都未经授权访问数据。

问题是如何最好地存储密钥。可以选择基于某些机器特定ID对其进行加密,但是在机器上运行诊断工具的任何人都可以轻松获得该信息。

在应用程序中对其进行编码是一种选择(它是一次性应用程序)。但是,.NET程序集很容易反编译。那么,最好是混淆它,使用加密启动器,编译它吗?

或者我有一个选项吗?

我们很清楚,我知道如果某人有决心,这几乎是一个失败的原因,但我们希望在限制范围内尽可能地让它变得更加坚硬。

3 个答案:

答案 0 :(得分:5)

加密内置于.NET配置系统中。您可以加密app / web.config文件的块,包括存储私钥的位置。

http://www.dotnetprofessional.com/blog/post/2008/03/03/Encrypt-sections-of-WebConfig-or-AppConfig.aspx

答案 1 :(得分:4)

在混淆术语中,您所追求的是常量隐藏,即将常量转换为例如在运行时执行的许多函数和计算的方法。 - 物化化常数。

然而,这仍然属于混淆域,并且易受代码提取的影响,攻击者只需将与此常量相关的代码映射出来,然后在单独的应用程序中运行它以检索值;或者将应用程序的内存转储到正确的位置,以便扫描它以获得所需的值。

还有一种稍微更先进的隐藏加密密钥的方法,称为白盒加密,它通过从给定密钥生成密码函数,烘焙它们来使用无密钥密码一起。顾名思义,这种方法即使在白盒攻击情形下也具有弹性(攻击者可以访问字节码,并且能够在运行时检查和操作可执行文件)。

这些都是通过默默无闻来实现安全性的非常先进的方法,并且值得考虑的替代模型不会强迫您首先执行此操作。

答案 2 :(得分:2)

如果有人可以将调试器附加到您的程序中,那么您无能为力。他们不必弄清楚你的配置,反汇编你的应用程序等等。所有他们要做的就是运行应用程序 - 看它使用密钥 - 宾果游戏。

在这些条件下,混淆无济于事。

最好的防御方法是使用硬件来保护密钥 - 这将执行加密但不会自动发出密钥(有时会加强攻击,例如探测电线,将内存暴露在低温/辐射/其他小说的东西)。 IBM做了一些适当的事情(谷歌IBM-4764),但它并不便宜。