2016-12-29 111 views
5

目前我存储类文件本身,这似乎并没有那么聪明,因为最终用户能够简单地使用反射器的情况下查看源代码,它不是obfruscated在我的C#MySQL连接信息。C#保护数据库连接信息

如何以安全的方式存储这些信息?

的源代码:

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); 
} 
+1

依靠本地安全不是任何形式的安全。如果您远程托管多个独立最终用户连接的数据库,则应通过Web服务(API)公开它,而不是让用户直接访问数据库。无论您使用的是任何本地安全性,仍然可以获取连接字符串。即使密码也可能通过反思获得。它与MS SQL连接。 – john

+1

我更喜欢将这些详细信息存储在web.config或app.config中,并确保它们已加密。请检查这个帖子。 HTTP://计算器。com/questions/10168240/encrypting-decrypting-a-string-in-c-sharp –

+1

如果Web Service(API)不可用,则至少可以加密敏感数据。它仍然可以获得,但至少不是每个人都能获得。 – Vladimir

回答

3

我回答这个问题,以解决安全本地应用,因为这就是OP的情况听起来,尽管其他的答案对待它,如果它是一个Web应用程序。

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

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

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


如果每个用户都有自己的数据库,那么你可以简单地存储在本地加密的连接字符串,因为这将是足以防止大多数问题,除恶意攻击者能够访问用户的机器。显然,正如弗拉基米尔所说,你可以把它作为一个通用的解决方案(在配置中对它进行加密,并希望最好),但是如果需要任何安全性,我真的不建议这样做。例如,如果您将用户密码存储在数据库中(即使以散列形式),这也不是一个安全的想法。每个人都使用这种方法运行的风险是,有人可能会窃取您的所有数据,或者擦除所有数据,甚至操纵数据来获得他们的优势。

+0

要运行Web服务,我需要一个Windows服务器而不是Linux服务器吗? – user7347727

+0

你也可以使用Linux。 Mono可以托管一项Web服务。 – john

3

保护连接字符串在.NET的标准方法是将它们在你的配置文件进行加密。

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

您需要授予访问应用程序使用的密钥解密这个在运行时,看到MSDN article on secure connection strings

+0

这是否适用于桌面应用程序? – john