2

我遇到了密码框绑定的问题。我的应用程序遵循 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 模式并且同时我希望密码字符串是安全的时,以上两者中的哪一个是正确的选择。

4

1 回答 1

1

使用安全字符串真的比使用字符串更好吗

是和不是。SecureString为您提供了如何将秘密字符串保存在内存中的选项。它们有助于防止调皮的人使用调试器检查应用程序的内存内容以寻找秘密,并且它们还提供比常规字符串更好的处置保证。但也必须说它们是一个可以使用的 PITA,目前实际上很少有框架使用它们。这个先前的 SO 答案可能会很好地说明它们的好处。

当我遵循 MVVM 模式并且同时我希望密码字符串是安全的时,以上两者中的哪一个是正确的选择

在某些阶段,您将需要使用密码。很难获得 SecureString 的内容——它是为了安全。但是您如何获取内容并将该密码存储到您的数据库中,以便您可以将未来的登录与其进行比较?答案是 SecureString 不能解决这个问题——你仍然需要在盐和散列并存储它之前提取真正的字符串。如果输入的密码用于创建 X509Certificate2 并且您永远不会存储它,则使用 SecureString。

所以,答案是……
在需要自己访问字符串内容的地方使用常规字符串,在框架方法或 API 函数需要的地方使用安全字符串。

这意味着如果您要在 UI 中使用 PasswordBox,那么您将需要访问未加密的内容,以便您可以将其存储或将其与先前存储的条目进行比较。

于 2013-03-09T04:27:32.177 回答