WPF PasswordBox有多安全,真的吗?

时间:2017-11-30 15:10:24

标签: c# .net wpf security passwordbox

我最近已经就PasswordBox问了几个问题,但在我的问题的核心,我需要一种非常安全的方法来将非常敏感的信息输入我的.Net应用程序。< / p>

开箱即用,WPF PasswordBox可以控制获取密码或其他敏感信息。为了安全起见,它通过SecureString属性提供了一个SecurePassword对象,在我看来,这个对象足以满足我的需求。但是,我在这个控件中看到了一个主要缺陷 - 它有一个Password属性,这是用户在不安全的.Net字符串中输入的内容。

我想假设如果我从未访问过我的应用程序中的Password属性,那么我的敏感信息的不安全版本将永远不会生成,必须进行垃圾回收。没事。但是,由于字符串的安全形式的目的是保证值的安全性不受可以读取它们.Net内存的窥探过程(我假设)的影响,因此相同的窥探恶意代码只能查找PasswordBox在内存中闲逛,并找到一些方法来访问Password字段,使SecureString值的使用基本上没用?

我承认,我不知道这些漏洞是如何被执行的。但是,如果问题是某些应用程序可能在.Net内存管理器/垃圾收集器中嗅探您的变量,那么他们似乎只需要访问PasswordBox控制对象就可以了。 ,而不是内存中的字符串对象,只需访问Password属性。在这个难题中我可能会缺少什么? PasswordBox如果以明文形式包含Password属性,它是如何安全的?

2 个答案:

答案 0 :(得分:6)

PasswordBox.Password属性从SecurePassword属性创建.NET字符串,它不会在内部将其存储为字符串。使用SecureString的重点是减少时间感应数据存在于内存中,并减少该感测数据的副本数量。您可以在documentation中详细了解SecureString

SecureString是加密的(如果可能的话,通常是加密的),所以如果有人可以只读原始内存(比如有人偷了你的内存转储) - 他将无法从中读取你的密码。如果您的应用程序如此受到攻击,以至于攻击者可以将自己的dll注入到您的进程中并在那里运行任意代码 - 那么您无论如何都会遇到更大的问题(并且很可能密码不会出现在内存中)。

也就是说,在使用PasswordBoxSecureString时,您仍然可以遵循一些合理的指导原则。

  1. 如果您需要访问PasswordBox.SecurePassword,请务必处置结果:

    using (var pwd = myBox.SecurePassword) {
        // do stuff
    }
    
  2. 这可能看起来很奇怪(处理属性返回的内容),但应该这样做,因为此属性返回SecureString的副本,而应该是一个方法,但由于某种原因是属性。

    1. 尽可能少地访问Password属性,最好只在您真正需要时使用一次。您不希望密码的副本在内存中停留的时间越来越长。

    2. 完成后请务必致电yourBox.Clear()。这会将密码设置为空字符串并清除内部SecureString内存。

答案 1 :(得分:1)

您无需猜测,只需look it up

密码框没有字段Password。它有一个保存密码的字段PasswordTextContainer

这意味着文档正确无误

  

说明

     

获取Password属性值时,将密码作为纯文本显示在内存中。要避免这种潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取。

如果您没有将其作为纯文本阅读并在应用中将其保留为纯文本,则将不会明文。

但同样,不要相信互联网上的随机人(包括我!),just look at it yourself