WPF PasswordBox有多安全,真的吗?

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明文属性,那么它是如何安全的?

Evk*_*Evk 8

PasswordBox.Passwordproperty从属性创建.NET字符串SecurePassword,它不会在内部将其存储为字符串.使用的全部目的SecureString减少存储器中存在的感测数据的时间量,并减少该感测数据的副本数量.您可以SecureString文档中阅读更多相关信息.

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

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

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

    using (var pwd = myBox.SecurePassword) {
        // do stuff
    }
    
    Run Code Online (Sandbox Code Playgroud)

这可能看起来很奇怪(处理属性返回的内容),但是应该这样做,因为这个属性返回了一个副本,SecureString而应该是一个方法,但由于某种原因是属性.

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

  2. 完成后总是打电话yourBox.Clear().这将设置密码以清空字符串并清除内部SecureString存储器.