【问题标题】:C# protect database connection informationsC#保护数据库连接信息
【发布时间】:2016-12-29 13:16:55
【问题描述】:

目前我将我的 C# mysql 连接信息存储在类文件本身中,这似乎不太聪明,因为最终用户可以简单地使用反射器来查看源代码,以防它没有被混淆。

我怎样才能以安全的方式存储这些信息?

源代码:

private void Initialize()
{
    server = "xxx";
    database = "xxx";
    uid = "xxx";
    password = "xxx";
    string connectionString;
    connectionString = "SERVER=" + server + ";" + "DATABASE=" +
    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

    connection = new MySqlConnection(connectionString);
}

【问题讨论】:

  • 依赖本地安全并不是任何类型的安全。如果您远程托管多个独立最终用户连接的数据库,则应通过 Web 服务 (API) 公开它,而不是让用户直接访问数据库。无论您采用何种本地安全措施,仍然可以取回连接字符串。甚至密码也可能通过反射获得。它与 MS SQL 连接。
  • 我希望您将此详细信息存储在 web.config 或 app.config 中,并确保它们已加密。请检查这篇文章。 stackoverflow.com/questions/10168240/…
  • 如果 Web 服务 (API) 不可用,您至少可以加密敏感数据。它仍然可以获得,但至少不是每个人都可以获得。

标签: c# mysql


【解决方案1】:

我回答这个问题是为了解决本地应用程序的安全问题,因为这就是 OP 的情况,尽管其他答案将其视为 Web 应用程序。

如果一个数据库由具有不同安全问题的多个用户共享,我怀疑是这样,那么你真的不应该将数据库连接字符串存储在本地、代码、配置中、在配置中加密等. 客户永远不应该拥有这些信息。只有这样才能真正保证客户端安全。

一个坚定的人可以简单地对您的代码进行逆向工程,并解密连接细节。此外,如果他们使用 .NET Reflector 之类的东西来调试您的代码,他们可以使用反射将连接字符串(包括密码)从连接对象中提取出来。然后,他们可以轻松地直接连接到您的数据库并提取他们想要的任何信息。当然你可以有一个 IP 白名单,但如果其中一个用户不好,那么你仍然会遇到同样的问题。

我的建议是您创建一个网络服务来操作您的数据库。然后,您的最终用户使用的软件只需使用用户的凭据通过 Web 服务对自身进行身份验证,然后使用它来访问他们被允许访问的资源。这就是现代应用程序的运行量。


如果每个用户都有自己的数据库,那么您可以简单地在本地存储加密的连接字符串,因为这足以防止大多数问题,除了可以访问用户计算机的恶意人员。

显然,正如 Vladimir 所说,您可以将此作为通用解决方案(在配置中对其进行加密并希望获得最好的结果),但如果需要任何安全性,我真的不建议这样做。例如,如果您将用户密码存储在数据库中——即使是散列形式——这不是一个安全的想法。对每个人使用这种方法所面临的风险是,有人可能会窃取您的所有数据,或擦除您的所有数据,甚至操纵数据以谋取利益。

【讨论】:

  • 要运行 Web 服务,我需要 Windows 服务器而不是 linux 服务器,对吗?
  • 您也可以使用 Linux。 Mono 可以托管 Web 服务。
【解决方案2】:

在 .NET 中保护连接字符串的标准方法是在您的配置文件中对其进行加密。

aspnet_regiis -pe "connectionStrings" -app "/SampleApplication"

您需要授予对应用程序的访问权限,以便在应用程序运行时使用密钥对其进行解密,请参阅MSDN article on secure connection strings

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2010-10-16
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多