我想使用SecureString来保存数据库的连接字符串。但是,只要我将SqlConnection对象的ConnectionString属性设置为securestring的值,它肯定会对能够读取应用程序内存的任何其他应用程序可见吗?
我做了以下假设:
a)我无法在托管内存中实例化SqlConnection对象
b)托管内存中的任何字符串都可以由Hawkeye
答案 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加密。
另一种解决方案是通过数据库服务器上的服务托管您的数据访问层,该服务在本地系统帐户下运行,该帐户连接到数据库并提供数据,而本地用户无法访问服务配置