使用securestring进行sql连接

时间:2009-12-17 15:02:03

标签: c# .net securestring

我想使用SecureString来保存数据库的连接字符串。但是,只要我将SqlConnection对象的ConnectionString属性设置为securestring的值,它肯定会对能够读取应用程序内存的任何其他应用程序可见吗?

我做了以下假设:
a)我无法在托管内存中实例化SqlConnection对象
b)托管内存中的任何字符串都可以由Hawkeye

等应用程序读取

5 个答案:

答案 0 :(得分:5)

当您需要将字符串传递给托管API(例如设置ConnectionString)时,SecureString无法为您提供任何好处。

它真正用于与安全的非托管API进行安全通信。

理论上,微软可以考虑增强SqlConnection对象以支持安全的ConnectionString,但我认为他们不太可能这样做,因为:

  • SecureString实际上仅在客户端应用中有用,例如密码是从用户输入逐个字符构建的,而不是在托管字符串中使用整个密码。

  • 在这样的环境中,使用Windows身份验证与SQL Server的连接更为常见。

  • 在服务器上还有其他方法可以保护SQL Server凭据,首先是限制授权管理员访问服务器。


2012

Microsoft 通过传递 SqlConection <来增强 SqlCredential 对象,以支持安全的 ConnectionString / strong>到新的 SqlConnection.Credential 属性:

SecureString pwd = AzureVault.GetSecretStringSecure("ProcessPassword");
SqlCredential = new SqlCredential("Richard", pwd)
connection.Credential = cred;

不幸的是,没有其他 DbConnection 后代(例如,OdbcConnection,OleDbConnection,OracleConnection,EntityConnection,DB2Connection)支持它。

答案 1 :(得分:4)

是的,您可以,是的,您应该使用SecureString来避免让密码在内存中畅通无阻并开放攻击。您需要使用新的SqlCredential类,而不是使用sql连接字符串,其中Password属性是SecureString。请参阅以下文章寻求帮助。

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcredential.password(v=vs.110).aspx

http://www.codeproject.com/Tips/408901/Storing-your-connection-string-password-in-SecureS

答案 2 :(得分:0)

如果您担心安全问题,我建议您在SQL Server中启用SSL并使用SSL与其通信。

答案 3 :(得分:0)

为什么连接字符串是个问题?密码不是您想要保护的密码(除非您将密码放在连接字符串中,这对我所见过的所有驱动程序都是可选的)。话虽这么说,密码通常必须在某些时候在内存中“明确”(除非驱动程序有一些api允许加密密码或其他东西,但这可能实际上不会有太多帮助)。

通常这不是问题,因为该过程处于安全的环境中,例如在Web服务器上,或作为系统管理员类型的帐户运行(因此普通用户无法访问进程内存),或者通常两者都是。如果这是在用户空间中运行的客户端计算机上,则必须假设该过程无论如何都会受到损害,这无济于事。一旦确保了这一过程,您就不必担心这样的事情。

答案 4 :(得分:0)

为SQLConnection.ConnectionString分配SecureString值将绕过安全性,使其无效。

SecureString旨在解决这些正常的字符串问题,ref

  • 没有固定,垃圾收集器可以移动它,将副本留在内存中
  • 未加密
  • 如果您的进程被换出到磁盘,则该字符串将位于您的交换文件中
  • 不可变,修改它会使旧版本和新版本都保留在内存中
  • 使用它时无法清除它

恕我直言,SecureString类型是一个伪劣安全实现的补丁,目前SecureString尚未在整个框架中实现,因此它的好处无法完全使用。

我遇到同样的问题,我选择在内存中存储敏感信息的RSA加密。

另一种解决方案是通过数据库服务器上的服务托管您的数据访问层,该服务在本地系统帐户下运行,该帐户连接到数据库并提供数据,而本地用户无法访问服务配置