C#保护数据库连接信息

问题描述 投票:0回答:2

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

如何以安全的方式存储 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);
}
c# mysql
2个回答
5
投票

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

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

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

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


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

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


3
投票

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

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

您需要授予应用程序访问权限,以便在应用程序运行时使用密钥对其进行解密,请参阅有关安全连接字符串的 MSDN 文章

© www.soinside.com 2019 - 2024. All rights reserved.