我想使用SecureString来保存数据库的连接字符串。但是,一旦我将SqlConnection对象的ConnectionString属性设置为securestring的值,就肯定可以对其他任何能够读取我的应用程序内存的应用程序进行查看吗?

我做了以下假设:
a)我无法在托管内存之外实例化SqlConnection对象
b)诸如Hawkeye之类的应用程序可以读取托管内存中的任何字符串

最佳答案

当您需要将字符串传递给托管API(例如设置ConnectionString)时,您的绝对权利SecureString不会给您带来任何好处。

它实际上是为与安全的非托管API进行安全通信而设计的。

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

  • SecureString实际上仅在客户端应用中有用,例如密码是根据用户输入的字符来构建的,而无需将整个密码都存储在托管字符串中。
  • 在这种环境中,更常见的是使用Windows身份验证连接到SQL Server。
  • 在服务器上,还有其他保护SQL Server凭据的方法,首先是将服务器的访问权限限制为授权的管理员。


  • 2012年

    Microsoft通过将 SqlConection 传递给新的 SqlCredential SqlConnection.Credential ojit_r属性,确实增强了 DbConnection 对象以支持安全的 ConnectionString :
    SecureString pwd = AzureVault.GetSecretStringSecure("ProcessPassword");
    SqlCredential = new SqlCredential("Richard", pwd)
    connection.Credential = cred;
    

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

    关于c# - 使用securestring进行SQL连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1922313/

    10-11 01:53