SqlCredential 和 SecureString 生命周期管理

SqlCredential and SecureString lifetime management

System.Data.SqlClient.SqlCredential class 有一个接受用户名 (System.String) 和密码 (System.Security.SecureString) 的双参数构造函数。

调用此构造函数后,处理存储密码的SecureString安全吗?我希望 SqlCredential class 应该根据 SQL 服务器身份验证方案对密码执行单向散列,而不需要继续访问参数......但也许这不能直到打开连接并发出挑战(HMAC 计算中可能涉及随机数以防止重放攻击)。如果 SqlCredential 确实独立保留了所需的信息,那么我自然要加快擦除 SecureString 存储, 可逆的。

我一直无法在文档中找到任何声明,说明传入的密码 SecureString 对象是否必须在 SqlCredential 构造函数 returns.

之后保持有效

SqlCredential 实际上不处理或存储任何密码派生数据;它只是一个方便的结构,用于保存与 SqlConnection.

关联的凭证相关参数

密码 SecureString 实例需要保持有效,直到调用 SqlConnection.Open() 或该函数将抛出 ObjectDisposedException。如果像我一样,您的应用程序有任何自动重新连接逻辑,您将需要无限期地保持 SecureString(或重新创建它的能力)。至少在带有 Win32 的 .NET Framework 上,SecureString 在静止时对其内容进行加密,因此进程内存转储不会暴露秘密。