我遇到了密码盒绑定的问题。我的应用程序遵循MVVM。当我试图在谷歌上搜索如何解决密码盒绑定的问题时,我发现了两种解决方案-1>使用附加属性2>使用安全字符串(http://www.griffinscs.com/blog/?tag=mvvm)。由于第二个选项似乎更安全,我倾向于选择这个选项。但后来我发现我可以使用以下代码
在安全字符串中提取实际字符串IntPtr iPtr = Marshal.SecureStringToBSTR(securePassword);
// securePassword is of SecureString type
string str = Marshal.PtrToStringUni(iPtr);
现在我有点困惑了。请帮助我理解以下问题1>使用安全字符串真的比使用字符串更好吗?2>当我遵循MVVM模式并同时希望密码字符串安全时,上述两个中的哪一个是正确的选择
使用安全字符串真的比使用字符串
好
是和不是。SecureString为您提供了如何在内存中保存秘密字符串的选项。它们有助于防止调试器检查应用程序的内存内容以寻找秘密,并且它们还提供了比常规字符串更好的处理保证。但也不得不说,它们是一种可以使用的PITA,目前很少有框架实际使用它们。前面的答案可能会让你很好地了解它们的好处。
当我遵循MVVM模式时,上述两个中的哪一个是正确的选择,同时我希望密码字符串是安全的
在某些阶段您将需要使用密码。很难获得SecureString的内容-它意味着是安全的。但是,如何获取内容并将该密码存储到数据库中,以便对以后的登录进行比较呢?答案是SecureString并不能解决这个问题——您仍然需要在对其进行盐化、散列和存储之前提取真正的字符串。如果输入的密码是用于创建X509Certificate2,并且您永远不会存储它,则使用SecureString。
所以,答案是....
在需要自己访问字符串内容的地方使用常规字符串,在框架方法或API函数需要的地方使用安全字符串。
这意味着如果你打算在UI中使用PasswordBox,那么你将需要访问未加密的内容,以便你可以存储它或将它与先前存储的条目进行比较。