在MSDN文档上PasswordBox.Password说:
获取Password属性值时,将密码作为纯文本显示在内存中.要避免此潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取.
所以我发送SecurePassword到我的视图模型的PasswordChanged事件,期望一切都是安全的,但如果我用Snoop检查我的应用程序,在PasswordBox的Password属性中,我看到我以纯文本输入的密码.这不会破坏使用SecurePassword的全部目的吗?我还应该做些什么来保护密码吗?
这是我的拙见.
Snoop在运行应用程序时注入其代码.所以,它基本上是一个黑客工具.一个非常易于使用的黑客工具,仅适用于您的GUI.这就是为什么简单地改变任何项目的可见性以隐藏来自用户的一些数据的原因是一个较差的安全性.不应在UI层处理有关限制,访问和安全性的所有内容.有关如何Snoop证明您的wpf应用程序的方法?但主要的答案是,你必须设计你的应用程序,这不允许窥探违反任何东西.例如,验证服务器上的所有内容.
回到你的问题:
有两种情况.第一个是:用户创建密码.如果用户或用户的恶意软件此时会看到密码,我相信这不是问题.然后你收到并存储安全字符串.并清除用户的密码.
第二种情况:您向用户显示存储的密码.诀窍是 - 你不显示它.您知道密码的长度,因此您可以使用****显示刚刚禁用的文本框.如果用户想要更改密码 - 你给他实际的密码箱,他必须填写旧密码和新密码,我们回到方案#1.
一线希望是:
当用户输入密码时,它并不是什么大不了的事,因为用户知道他输入了什么,恶意软件可以跟踪按下的按键.
存储密码后,您永远不会将其交还给用户
更新:这是密码框的密码属性的源代码
public string Password
{
[SecurityCritical]
get
{
string password;
using (SecureString securePassword = this.SecurePassword)
{
IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(securePassword);
try
{
unsafe
{
password = new string((char*)ptr);
}
}
finally
{
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);
}
}
return password;
}
Run Code Online (Sandbox Code Playgroud)
所以,我想MSDN所说的是,无论何时访问Password属性,通过在代码中调用它(或在调试时在VS中查看它,或者将其视为Snoop),你都会调用它的get方法,它将SecuredString解密为纯文本,是什么让它暴露在记忆中.如果您不调用Password属性并且不通过检查软件工具来调用它,则密码不会以纯文本形式显示在内存中.
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |