8

我相信我误解了SecureString. 我知道string's 是不可变的,并且在堆上以明文形式找到密码或敏感数据。

我很难理解的是,如何SecureString在需要验证数据库中的散列密码的客户端应用程序中使用?

这是我的背景:

  • 我正在使用 WPF 客户端应用程序。
  • 我有一个本地 SQL 数据库(在客户端的机器上)
  • 密码经过哈希处理并存储在数据库中。
  • 用户尝试登录到我的 WPF 应用程序
  • SecureStringPasswordBox 控件通过SecurePassword属性将密码存储在 a中。

怎么办?如何在SecureString不先将其转换回字符串的情况下散列一个?

到目前为止,我收到的所有建议都是编写转换SecureString为的扩展方法String,对其进行哈希处理,然后将其发送到 db 进行验证。但这会破坏整个练习!

我必须接受SecureString在我提到的上下文中没用并使用 plainstring吗?

4

1 回答 1

4

SecureString 表示为 byte[] 您可以使用 bitconverter 对字节进行编码并保存结果。此外,SecureString 是一种加密而不是散列,因为它可以被解密。(见下文)

SecureString 主要用于在内存中存储敏感数据。如果您有一个服务/网站,这并不像存储在数据库中的值那么重要。这些不应该是纯文本,并且 imo不能被您或任何管理员解密另外我不确定另一台服务器是否可以解密字符串,所以当您更改服务器或有某种集群场景时可能会遇到问题。

特别是对于密码更喜欢使用哈希算法(例如SHA256)。这些不能解密(如数字的总和)。在登录功能的用例中,您将加密用户输入并比较用户和数据库中的哈希值。(详情见下文)我还建议在 hashinput 中添加一个动态标准,如用户 ID,以便 2 个具有相同密码的用户具有不同的哈希值。

使用这种策略,您没有用户密码的风险,因此如果数据泄露,此时不会有问题。

这里是使用哈希算法的简短概述

所以(如果给出了securestring)首先解密SecureString

String SecureStringToString(SecureString value){
  IntPtr valuePtr = IntPtr.Zero;
  try{
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    return Marshal.PtrToStringUni(valuePtr);
  }
  finally{
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}

例如,使用 SHA256 对其进行哈希处理。从这个帖子

  using (SHA256 hash = SHA256Managed.Create()) {
    Encoding enc = Encoding.UTF8;

    //the user id is the salt. 
    //So 2 users with same password have different hashes. 
    //For example if someone knows his own hash he can't see who has same password
    string input = userInput+userId;
    Byte[] result = hash.ComputeHash(enc.GetBytes(input));

    foreach (Byte b in result)
      Sb.Append(b.ToString("x2")); //You could also use other encodingslike BASE64 
  }

存储此哈希和。根据您的编码,它可能如下所示:

ac5b208b4d35ec79fa7c14b7a31f9c80392cdab2bc58bc5b79bcfe64b044d899

在您的数据库中。如果用户登录,则从他的输入创建散列并将其与数据库中的散列进行比较。如果它们相等,则密码正确。因此,您永远不需要将明文用户密码存储在任何地方。

如果客户端进行散列,那么它应该绝对不应该以纯文本形式存在(如果它不支持安全字符串,则文本框除外)

PS:这只是一种选择。但最主要的是永远不要在任何地方存储明文密码。最好永远不知道它们,也没有任何改变可以让它们解密。

另一种策略是使用RSA非对称加密,但这可能会变得更加复杂。如果您需要帮助,我会推荐一个专门的帖子。

根据您的要求和环境,大多数时候哈希和应该是可接受的解决方案。(但这不是法律建议,因为我不是律师)

于 2015-06-03T11:24:42.637 回答