【问题标题】:why encrypted data in app.config can be read from another program为什么 app.config 中的加密数据可以从另一个程序中读取
【发布时间】:2013-09-18 08:28:59
【问题描述】:

我的App.Config 文件中有一个ConnectionString,该文件由DataProtectionConfigurationProvider 提供程序加密,并且在解决方案A 中一切正常。

然后我构建另一个解决方案 (解决方案 B) 并将 App.Config 文件添加到它的项目中。并尝试解密该配置文件,令人惊讶的是一切都很好!虽然我希望第二种解决方案无法解密ConnectionString
假设我部署了这个项目,在安装时,询问SqlConnection 信息,如USERIDPASSWORD 然后解密它们并将其放入App.Config 文件中。一切都还好!但是,如果其他人尝试添加生成的App.Config 文件(在最终用户机器中)并解密我的ConnectionString,会发生什么?
我们尝试对此类数据进行加密,以使其他人(除了我们的程序)无法接触到数据。

  • 有人使用解决方案 B 触摸我的数据是否符合逻辑?
  • 如果是这样,我可以做些什么来保证我的数据安全?
    ----------已编辑 ------------
    顺便说一句,我正在使用用户级解密,并且该项目是 Windows 应用程序而不是 Web 应用程序

【问题讨论】:

    标签: c# encryption configurationmanager


    【解决方案1】:

    保护您的应用配置中的数据,如果您真的想确定的话,意味着使用特定于您的应用的密钥进行加密,并将结果作为 BASE64 编码字符串存储在您的配置设置中。

    在写入数据之前,您必须使用文本编码将文本转换为字节数组。然后加密该数组,然后将生成的数组转换为 base64 编码字符串,然后将其存储在配置中。

    在检查数据之前,您必须解码 base64 编码,解密结果信息(字节数组),然后使用相同的文本编码将字节数组转换为实际文本。

    如果你真的想成为一只猪,你可以使用不对称算法——用私钥编码,用公钥解码。这意味着不仅配置数据难以阅读,而且无法修改(因为您不会在应用程序中提供私钥 - 只有公钥)。

    【讨论】:

    • 第一个解决方案(通过我的头脑)很好,但我如何告诉一些框架,如 codesmith NetTierEntity Framework 先解密该数据,然后将其作为 ConnectionString 使用?
    • 你不会 - 连接字符串的加密发生在实体框架之外 - 完全独立于它。在运行时,您解码数据,获取连接字符串,然后使用它。我不是实体框架,但如果 DataContext 没有通过连接字符串进行实例化,我会感到惊讶......
    【解决方案2】:

    加密密钥存储在机器级别或用户级别(我不确定您如何决定使用哪个),因此在同一台机器/用户上运行的任何程序都可以解密该字符串。

    您使用了错误的工具来完成这项工作,DataProtectionConfigurationProvider 是为了防止有人获得您的网站/程序的数据转储(主要用于 IIS)并能够使用不同的机器/用户连接到您的背后结束数据库。

    很遗憾,我不知道什么是适合您的“适合工作的工具”。 “从用户正在运行的计算机上隐藏数据”非常困难。我能提出的唯一建议是阅读this old question of mine,我会在其中提出与您类似的问题,并在this old answer of mine 中回答有关人们入侵/破解您的应用程序的问题。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多