C#保护数据库连接信息

use*_*727 6 c# mysql

目前我在类文件本身中存储了我的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);
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 5

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

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

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

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


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

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