c# – WPF PasswordBox有多安全,真的吗?
作者:互联网
我最近已经就PasswordBox提出了几个问题,但在我的问题的核心,我需要一种非常安全的方法来将非常敏感的信息输入到我的.Net应用程序中.
开箱即用,WPF PasswordBox可以控制获取密码或其他敏感信息.为了安全起见,它通过SecurePassword属性提供了一个SecureString对象,在我看来,该属性足以满足我的需求.但是,我在这个控件中看到了一个主要缺陷 – 它有一个Password属性,它是用户在不安全的.Net字符串中输入的内容.
我想假设如果我从未在我的应用程序中访问Password属性,我的敏感信息的不安全版本将永远不会生成,必须进行垃圾回收.没事.但是,由于字符串的安全形式的要点是保持值不受窥探过程(我假设)可以读取它们的.Net内存,可能同样的窥探,恶意代码只是寻找一个闲置的PasswordBox在内存中找到一些方法来访问密码字段,使得使用SecureString值基本没用?
我承认,我不知道这些漏洞是如何执行的.但是,如果问题是某些应用程序可能在.Net内存管理器/垃圾收集器中嗅探您的变量,那么我觉得他们所要做的只是访问PasswordBox控件对象而不是字符串对象似乎是合理的.在内存中,只需访问密码属性.在这个难题中我可能会缺少什么?如果PasswordBox包含明文密码属性,它是如何安全的?
解决方法:
PasswordBox.Password属性从SecurePassword属性创建.NET字符串,它不会在内部将其存储为字符串.使用SecureString的重点是减少存储器中存在的感测数据的时间量,并减少该感测数据的副本数量.您可以在documentation中阅读有关SecureString的更多信息.
SecureString是加密的(如果可能的话,通常是加密的),所以如果有人可以只读原始内存(比如有人偷了你的内存转储) – 他将无法从中读取你的密码.如果您的应用程序如此受到攻击,以至于攻击者可以将自己的dll注入您的进程并在那里运行任意代码 – 那么您无论如何都会遇到更大的问题(并且很可能密码不会出现在内存中).
也就是说,在使用PasswordBox和SecureStrings时,您仍然可以遵循一些合理的指导原则.
>如果您需要访问它,请务必处理PasswordBox.SecurePassword的结果:
using (var pwd = myBox.SecurePassword) {
// do stuff
}
这可能看起来很奇怪(处理由属性返回的内容),但应该这样做,因为此属性返回SecureString的副本,而应该是一个方法,但由于某种原因是属性.
>尽可能少地访问密码属性,最好只在您真正需要时使用一次.您不希望密码的副本在内存中停留的时间越来越长.
>完成后,始终调用yourBox.Clear().这将设置密码为空字符串并清除内部SecureString内存.
标签:c,security,net,wpf,passwordbox 来源: https://codeday.me/bug/20190611/1216584.html