繁体   English   中英

NetworkCredentials以纯文本形式公开密码

[英]NetworkCredentials exposes password in plain text

我即将在我的C#/ WPF应用程序中创建一个身份验证模块。 要对用户进行身份验证,我想使用NetworkCredential来存储凭据。

Credential = new NetworkCredential(credential.UserName, credential.Password);

其中credential.UserNamestringcredential.Password的类型为SecureString 调试应用程序时,我可以在纯文本和安全字符串中看到密码

在此输入图像描述

为什么密码是以纯文本形式公开的? 这不是一个可能的安全威胁吗?

谢谢回答。

编辑:

对于记录,应在WCF客户端上使用NetworkCredential对象,如下所示:

client.ClientCredentials.Windows.ClientCredential = Credentials

NetworkCredential类在内部始终将密码存储SecureString

 public string Password {
        get {
            ExceptionHelper.UnmanagedPermission.Demand();
            return InternalGetPassword();
        }
        set {
            m_password = UnsafeNclNativeMethods.SecureStringHelper.CreateSecureString(value);
        }
    }

当有人需要以纯文本的形式检索密码时(无论是从某个类还是从该类中的某个地方开始),它都会从安全字符串中检索密码

    internal string InternalGetPassword() {
        string decryptedString = UnsafeNclNativeMethods.SecureStringHelper.CreateString(m_password);
        return decryptedString;
    }

使用调试器时,它显示属性,因此从SecureString检索值

SecureString与加密无关! (一个粗略的过度简化 - 它可能也加密了,但这里并不重要;如果你从普通string创建一个SecureString ,你已经否定了SecureString大量收益 - 短期)

它只是一个可以确定性地解除分配的字符串。 出于安全原因,这很重要,因为.NET字符串可能非常长寿(对于实习字符串,应用程序的整个生命周期)。

NetworkCredential不用于存储凭证 - 它只是一个简单的马车,可以让它们到达目的地 - 基本上是一个常见的API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM