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