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