.NET加密

21

我想了解的是将连接字符串加密到配置文件中的明确方法。我的问题如下:

  1. 使用机器级别的加密,任何能访问我的服务器的人都可以编写一个小的.NET程序来读取连接字符串的内容,这是正确的吗?

  2. 如果我在企业环境中将我的应用程序部署到用户的计算机上,并且应用程序在配置文件中有连接字符串,如何确保只有我的应用程序才能解密它?这种情况在 ClickOnce 部署方案中尤其有趣。我已经听说过一些人将未经加密的配置存储在发布服务器上,并在应用程序第一次下载、安装和执行时在机器级别进行加密。但我觉得这样很有问题——连接字符串在网络上传输时没有受到保护,在下载和应用程序执行之间也没有受到保护。

  3. 我是否可以拥有公钥和私钥,签署我的应用程序,使用密钥加密配置文件,当用户执行它时,只有经过签名的应用程序才能解密?

  4. 由于我正在使用 ClickOnce,我可以在代码或嵌入式中包含加密的敏感信息,因为 ClickOnce 只有版本号发生更改才会检测到变化。所以,如果我需要重新编译以更改连接字符串,那么使用 app.config 的意义就不存在了。除了使用配置文件之外,我还可以采取哪些方法来保护服务器、客户端和它们之间的连接字符串?


请问您能更深入地描述一下您的第一个问题吗?什么是“机器级别”加密? - nightcoder
据我所知,您可以使用内置加密来进行机器级别和用户级别的加密。例如,使用configSection.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider"); 或通过aspnet_regiis.exe。 - Gus Cavalcanti
1
也许更有意义的是详细说明你昨天提出的问题(https://dev59.com/IEfRa4cB1Zd3GeqP_KxJ),而不是创建一个不同措辞的重复问题。 - Mark Carpenter
今天的加密方法可能在明天就变得不安全了。这似乎是事实。 - Demi
4个回答

14
  1. 是的。使用机器密钥加密的秘密可以被具有机器密钥访问权限的任何进程解密。使用用户密钥加密的秘密可以被由同一用户启动的任何进程解密。
  2. 这是不可能的。所有相反的声明都是骗局。您的应用程序需要一个秘密来解密某些内容。没有已知的方案可以隐藏应用程序内部的秘密。有各种混淆方案,但没有完美无缺的方案。您能做的最好的事情就是提高难度。
  3. 不可以。要么应用程序具有解密某些内容所需的秘密密钥,这样您就会回到第 2 点,要么您的应用程序具有公共密钥,在这种情况下,任何人都可以解密相同的秘密,因此您基本上只对配置进行验证(未被篡改),但该配置不是保密的。
  4. 您无法安全地在应用程序中部署嵌入式秘密。这只是价格高低的问题,如果您的受保护资产(秘密)很值钱,那么黑客就会拿到它。

加密基础设施旨在保护当前用户的秘密免受其他用户的侵害。它并不是为了保护应用程序的秘密免受使用该应用程序的用户的侵害。您所要求的不是加密,而是数字版权管理(DRM),您需要查找 DRM 基础设施以获取答案。我不知道 DRM API 是否有托管库。


3

实际上这是一个好问题,

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


2

使用对称加密存储秘密信息一直是有问题的,除非您不想提示输入密码或使用其他技术解密您的秘密信息(例如特殊硬件)。当必须在系统上存储完整的密钥时,就会有其他人拿到它的方法。

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


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接