.Net 加密

Posted

技术标签:

【中文标题】.Net 加密【英文标题】:.Net Encryption 【发布时间】:2010-10-28 02:24:37 【问题描述】:

我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题:

    使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗?

    如果我将我的应用程序部署到企业环境中的用户计算机,并且应用程序在配置文件中有连接字符串,我如何确保只有我的应用程序可以解密它?该场景在 ClickOnce 部署场景中特别有趣。我读过有人在发布服务器上存储未加密的配置,并在首次下载、安装和执行应用程序时在机器级别加密。这对我来说听起来很不对劲 - 连接字符串不受保护地穿过电线,并且在下载和应用程序执行之间的短暂时间内不受保护。

    我能否拥有一个公钥和私钥,对我的应用进行签名,使用密钥加密配置文件,当用户执行它时,只能从签名的应用中解密?

    李>

    由于我使用的是 ClickOnce,我可以在代码中或嵌入我的加密敏感信息,因为除非版本 # 更改,否则 ClickOnce 不会检测到更改。因此,如果我在更改连接字符串时需要重新编译,则 app.config 的点将被静音。除了使用配置文件之外,我还可以采取哪些其他方法来保护服务器、客户端以及它们之间的连接字符串?

【问题讨论】:

您能否更深入地描述您的第一个问题?什么是“机器级”加密? 据我所知,您可以使用内置加密在机器级别和用户级别进行加密。例如,使用 configSection.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");或通过 aspnet_regiis.exe 也许详细说明您昨天提出的上一个问题 (***.com/questions/890396/…) 比创建一个措辞不同的重复问题更有意义。 今天确定的加密方法是明天的愚蠢。看起来是这样。 【参考方案1】:

Gustavo 你也许可以实现这个,(这是我基于登录的应用程序的计划)。

用户在 .Net 应用程序中输入凭据。凭据被传递给 .php 服务器端应用程序,该应用程序使用它们登录数据库并检索密钥并将其传递回 .Net 应用程序。然后将密钥用于 .Net 应用程序中硬编码的加密连接字符串,以允许完整的数据库访问。

【讨论】:

【参考方案2】:
    是的。使用机器密钥加密的秘密可以被任何有权访问机器密钥的进程解密。使用用户密钥加密的秘密可以被同一用户启动的任何进程解密。 这是不可能的。所有相反的说法都是蛇油。您的应用程序需要一个秘密来解密某些东西。没有已知的方案可以在应用程序中隐藏秘密。有各种混淆方案,但没有什么是万无一失的。您能做的最好的事情就是提高标准。 没有。要么应用程序具有解密某些东西的密钥,在这种情况下你回到第 2 点,或者你的应用程序有公钥,在这种情况下任何人都可以解密相同的秘密,所以你基本上对配置进行验证(是没有被篡改),但配置不是秘密。 您无法在应用程序中安全地部署嵌入式机密。只是价格有多高的问题,如果您的受保护资产(秘密)值得,那么黑客就会得到它。

加密基础架构旨在保护当前用户的机密不被其他用户窃取。它并非旨在保护应用程序的机密不被使用它的用户。您要求的不是加密,而是 DRM,您需要查看 DRM 基础架构以寻求答案。我不知道DRM API 周围有托管库。

【讨论】:

谢谢鲁萨努。感谢您的帮助。【参考方案3】:

只要您不想提示输入密码或使用其他技术解决方案来解密您的秘密(如特殊硬件),使用对称加密存储秘密总是有问题的。当您必须将完整的密钥存储在系统的任何位置时,其他人将有办法检索它。

我肯定会尝试使用操作系统的机制。当您使用 MS-SQL 在纯 Windows 环境中工作时,您应该使用集成安全性而不是用户/密码。其他数据库也可能具有类似的功能。 另一个(较弱的)选项是使用操作系统的安全设置来保护明文文件 - 只有用户才能访问该文件。但是,您和您的用户必须信任管理员。在这种情况下,您应该另外使用对称加密。但是请参阅我的第一个论点 - 它不会真的很安全。

【讨论】:

【参考方案4】:

其实是个好问题,

您不能确定没有人会解密您的连接字符串(或密码)。当然,您可以对其进行加密,但人们将能够反编译您的应用程序并查看您使用的加密算法以及用于解密连接字符串/密码的密钥。也许这更像是极端情况,但有可能(我在学生时代是一个邪恶的饼干:))。因此,如果您害怕这种情况,您必须保护您的应用程序,使其更难反汇编。这是另一个讨论的主题,但例如,您可以使用 Dotfuscator 或其他好的混淆器 - 这将使破解者更难理解您的应用程序内部发生的事情。因此,一种可能的解决方案可以是“加密连接字符串 + 使用混淆器”,但是,正如我所说,它不会为您提供 100% 的保护。

【讨论】:

以上是关于.Net 加密的主要内容,如果未能解决你的问题,请参考以下文章

.NET中的加密算法总结(自定义加密Helper类续)

JAVA和.NET使用DES对称加密的区别

JAVA和.NET使用DES对称加密的区别

.NET Reflector怎么用它混淆加密?

C#ASP.NET MD5加密

PCB .NET Reactor 加密工具(NecroBit加密技术)