我即将在我的C#/ WPF应用程序中创建一个身份验证模块。要对用户进行身份验证,我想使用NetworkCredential
来存储凭据。
Credential = new NetworkCredential(credential.UserName, credential.Password);
credential.UserName
为string
且credential.Password
属于SecureString
类型。调试应用程序时,我可以在纯文本和安全字符串中看到密码
为什么密码是以纯文本形式公开的?这不是一个可能的安全威胁吗?
感谢您的回答。
编辑:
对于记录,NetworkCredential
对象应在WCF客户端上使用,如下所示:
client.ClientCredentials.Windows.ClientCredential = Credentials
答案 0 :(得分:12)
NetworkCredential
内部always stores the password作为SecureString
:
public string Password {
get {
ExceptionHelper.UnmanagedPermission.Demand();
return InternalGetPassword();
}
set {
m_password = UnsafeNclNativeMethods.SecureStringHelper.CreateSecureString(value);
}
}
如果有人需要以纯文本形式检索密码(在某个时候需要这个密码来自此类或链接的某个地方),那么retrieves it from the secure string:
internal string InternalGetPassword() {
string decryptedString = UnsafeNclNativeMethods.SecureStringHelper.CreateString(m_password);
return decryptedString;
}
使用调试器时,它显示属性,因此从SecureString
答案 1 :(得分:1)
SecureString
与加密无关! (一个粗略的过度简化 - 它可能它它也被加密了,但这里并不重要;如果你从普通SecureString
创建一个string
,你已经否定了很多获得SecureString
- 短期)
它只是一个可以确定性地解除分配的字符串。出于安全原因,这很重要,因为.NET字符串可能非常长(对于实习字符串,应用程序的整个生命周期)。
NetworkCredential
不用于存储凭据 - 它只是一个简单的旅行车,可以让它们到达目的地 - 基本上是一个常见的API。