【问题标题】:encrypt SQL connectionstring c#加密 SQL 连接字符串 c#
【发布时间】:2011-01-10 18:10:34
【问题描述】:

我创建了一个连接到 sql 2005 服务器的 c# 应用程序(不是 asp 网页)。在我的源代码中,这个 sql-server 的密码和用户 ID 在 ConnectionString 中以纯文本形式编码。

SqlConnection con = new SqlConnection();
con.ConnectionString = 
         "Data Source=server1;"+
         "Initial Catalog=mydatabase;"+
         "Integrated Security=no;"+
         "User ID=admin;Password=mypassword;";
con.Open();

有没有一种简单的方法来加密密码或整个连接字符串,让其他反汇编我工具的人看不到密码?

谢谢

【问题讨论】:

    标签: c# sql encryption connection-string


    【解决方案1】:

    您应该将连接字符串存储在配置文件中并加密该部分。请参阅http://www.4guysfromrolla.com/articles/021506-1.aspxhttp://msdn.microsoft.com/en-us/library/89211k9b%28VS.80%29.aspx

    【讨论】:

      【解决方案2】:

      有两种方法:

      1. 您可以使用配置安全部分从源代码中加密和解密连接字符串:
      try
      {
          // Open the configuration file and retrieve 
          // the connectionStrings section.
          Configuration config = ConfigurationManager.OpenExeConfiguration(exeConfigName);
          
          ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
          
          if (section.SectionInformation.IsProtected)
          {
              // Remove encryption.
              section.SectionInformation.UnprotectSection();
          }
          else
          {
              // Encrypt the section.
              section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
          }
          // Save the current configuration.
          config.Save();
          
          Console.WriteLine("Protected={0}",
          section.SectionInformation.IsProtected);
      }
      catch (Exception ex)
      {
          Console.WriteLine(ex.Message);
      }
      
      1. 您可以使用RSAProtectedConfigurationProviderDPAPIProtectedConfigurationProvider 执行加密企业图书馆数据访问应用程序块。

      完整文章请至 --> http://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx

      【讨论】:

      • 谢谢,但我不知道如何实现。我只是从我的 c# 项目中创建了一个 dll - 没有 exe 也没有 app.config?这个dll也必须在不同的计算机和用户上使用!
      • 一种方法是,您可以创建一个 XML 文件并将您的设置存储在其中。然后,您可以将该 XML 保存在您的每台部署机器中的某个特定位置,然后您就可以阅读它。最好的技术之一是使用自定义配置管理器,即管理您的配置项的不同类库,您的主 DLL 将引用它,或者您可以使用企业库中存在的配置块。
      【解决方案3】:

      不,你只能让它变得困难

      最好让应用程序使用一个特殊的数据库登录,它只能访问必要的表/过程。

      【讨论】:

        【解决方案4】:

        您可以像 web.config 一样在 app.config 中 encrypt sections。 MS 称之为Protected Configuration。由于加密数据和密钥都驻留在同一台机器上,这只会使获取数据变得更加困难,但理论上并非不可能获取数据。

        【讨论】:

          【解决方案5】:

          您也可以将用户名和密码存储在注册表中,而不是存储在配置文件中。尝试连接数据库时从注册表中读取用户名和密码。请记住,您必须在存储在注册表中时加密用户名和密码,并在从注册表中检索时解密用户名和密码。

          【讨论】:

          • 在注册表中存储纯文本信息与配置文件没有太大区别。只有当您考虑到您正在预防的威胁时,这才更有安全感。如果他们已经可以访问该文件,那么他们很可能可以访问该注册表项。他们知道自己在寻找什么。
          • 但 OP 明确声明“记住您必须加密用户名和密码”
          • 应用程序配置文件(app.config 和 web.config)是专门为包含此类信息而创建的。因此,使用这些文件管理用户/密码、连接字符串和所有其他应用程序设置比使用 Windows 注册表更有效和更简单。特别是在带有 ASP.NET 应用程序的服务器环境中。
          • @CheshireCat 更有效率?依靠。 Windows 注册表用于保存配置,过去是 INI 文件,*unix 系统为此使用文件,您可以通过查看 *unix 系统上的大量配置文件来选择。但是根据平台规范,注册表是保存桌面应用程序配置的更好地方。
          • 永远不要将敏感数据存储在配置文件中。注册表可以比文件更好地保护。复制注册表比复制文件要困难得多。存储在内存中远远超过任何一个。
          猜你喜欢
          • 2017-02-05
          • 2016-08-09
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多