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
在静止时对其内容进行加密,因此进程内存转储不会暴露秘密。
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
在静止时对其内容进行加密,因此进程内存转储不会暴露秘密。