我最近已经就PasswordBox
问了几个问题,但在我的问题的核心,我需要一种非常安全的方法来将非常敏感的信息输入我的.Net应用程序。< / p>
开箱即用,WPF PasswordBox
可以控制获取密码或其他敏感信息。为了安全起见,它通过SecureString
属性提供了一个SecurePassword
对象,在我看来,这个对象足以满足我的需求。但是,我在这个控件中看到了一个主要缺陷 - 它有一个Password
属性,这是用户在不安全的.Net字符串中输入的内容。
我想假设如果我从未访问过我的应用程序中的Password
属性,那么我的敏感信息的不安全版本将永远不会生成,必须进行垃圾回收。没事。但是,由于字符串的安全形式的目的是保证值的安全性不受可以读取它们.Net内存的窥探过程(我假设)的影响,因此相同的窥探恶意代码只能查找PasswordBox
在内存中闲逛,并找到一些方法来访问Password
字段,使SecureString
值的使用基本上没用?
我承认,我不知道这些漏洞是如何被执行的。但是,如果问题是某些应用程序可能在.Net内存管理器/垃圾收集器中嗅探您的变量,那么他们似乎只需要访问PasswordBox
控制对象就可以了。 ,而不是内存中的字符串对象,只需访问Password
属性。在这个难题中我可能会缺少什么? PasswordBox
如果以明文形式包含Password
属性,它是如何安全的?
答案 0 :(得分:6)
PasswordBox.Password
属性从SecurePassword
属性创建.NET字符串,它不会在内部将其存储为字符串。使用SecureString
的重点是减少时间感应数据存在于内存中,并减少该感测数据的副本数量。您可以在documentation中详细了解SecureString
。
SecureString
是加密的(如果可能的话,通常是加密的),所以如果有人可以只读原始内存(比如有人偷了你的内存转储) - 他将无法从中读取你的密码。如果您的应用程序如此受到攻击,以至于攻击者可以将自己的dll注入到您的进程中并在那里运行任意代码 - 那么您无论如何都会遇到更大的问题(并且很可能密码不会出现在内存中)。
也就是说,在使用PasswordBox
和SecureString
时,您仍然可以遵循一些合理的指导原则。
如果您需要访问PasswordBox.SecurePassword
,请务必处置结果:
using (var pwd = myBox.SecurePassword) {
// do stuff
}
这可能看起来很奇怪(处理属性返回的内容),但应该这样做,因为此属性返回SecureString
的副本,而应该是一个方法,但由于某种原因是属性。
尽可能少地访问Password
属性,最好只在您真正需要时使用一次。您不希望密码的副本在内存中停留的时间越来越长。
完成后请务必致电yourBox.Clear()
。这会将密码设置为空字符串并清除内部SecureString
内存。
答案 1 :(得分:1)
您无需猜测,只需look it up。
密码框没有字段Password
。它有一个保存密码的字段PasswordTextContainer。
这意味着文档正确无误
说明
获取Password属性值时,将密码作为纯文本显示在内存中。要避免这种潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取。
如果您没有将其作为纯文本阅读并在应用中将其保留为纯文本,则将不会明文。
但同样,不要相信互联网上的随机人(包括我!),just look at it yourself。