目前我在类文件本身中存储了我的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);
}
答案 0 :(得分:4)
我正在回答这个问题,以解决本地应用程序的安全问题,因为这就是OP的情况,尽管有其他答案将其视为Web应用程序。
如果一个数据库由具有不同安全问题的多个用户共享,我怀疑它是,那么你真的不应该在本地,代码,配置,配置中加密等存储数据库连接字符串客户端永远不应该有这些信息。这是真正保证客户端安全的唯一方法。
坚定的人可以简单地对您的代码进行反向工程,并解密连接细节。此外,如果他们使用类似.NET Reflector的东西来调试代码,他们可以使用反射从连接对象中提取连接字符串,包括密码。然后,他们直接连接到您的数据库并提取他们想要的任何信息是微不足道的。当然你可以有一个IP白名单,但如果其中一个用户不好,那么你仍然有同样的问题。
我的建议是您创建一个可以操作数据库的Web服务。最终用户使用的软件只需使用用户凭据通过Web服务对自身进行身份验证,然后使用该服务访问允许的资源。这是现代应用程序的运作方式。
如果每个用户都有自己的数据库,那么您只需存储本地加密的连接字符串,因为这足以防止大多数问题,但有权访问用户计算机的恶意用户除外。
显然,正如弗拉基米尔所说,你可以把它作为一般解决方案(在配置中加密并希望最好),但如果需要任何安全性,我真的不建议这样做。例如,如果您将用户密码存储在数据库中 - 即使是以散列形式存储 - 这也不是一个安全的想法。您为每个人使用此方法所带来的风险是,有人可能会窃取您的所有数据,或者擦除您的所有数据,甚至操纵数据以获得优势。
答案 1 :(得分:3)
在.NET中保护连接字符串的标准方法是在配置文件中加密它们。
aspnet_regiis -pe "connectionStrings" -app "/SampleApplication"
您需要授予对应用程序的访问权限,以便在运行时使用密钥对其进行解密,请参阅MSDN article on secure connection strings。