存储在数据库中的SecureString密码

这个问题在这里已经有了答案:

  • 在.NET 4中散列SecureString的答案

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

    SecureString主要意味着将敏感数据存储在内存中 。 如果你有一个服务/网站,这不像存储在数据库中的值那么重要。 这些不应该是明文,而不是海事组织你或任何管理员解密而且我不知道阉另一台服务器可以解密的字符串,所以当你改变服务器或具有群集方案的somekind的,你可能有问题。

    特别是对于密码来说更喜欢使用散列算法(如SHA256)。 这些不能被解密(比如数字的总和)。 在登录功能的用例中,您可以加密userinput并比较用户和数据库中的哈希值。 (下面的细节)我也建议添加一个动态标准,如用户标识到哈希输入,以便具有相同密码的两个用户拥有不同的哈希值。

    有了这个策略,你就不会有用户密码的risc,因此如果数据被泄露,在这一点上不会有问题。

    这里简要介绍一下使用哈希算法

    所以(如果给出了固定字符串)首先解密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 
      }
    

    存储这个hashsum。 根据你的编码,它可能会像这样:

    ac5b208b4d35ec79fa7c14b7a31f9c80392cdab2bc58bc5b79bcfe64b044d899

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

    如果客户端使用散列,那么它应该绝对不应该存在作为明文的地方(除非文本框不支持securestring)

    PS:这只是一个选择。 但最重要的是永远不要在任何地方存储明文密码。 为了最好不要知道他们,并没有改变,让他们解密。

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

    根据您的要求和envionment大多数时候hashsums应该是一个可接受的解决方案。 (但那不是法律建议,因为我不是律师)

    链接地址: http://www.djcxy.com/p/85561.html

    上一篇: SecureString password stored in database

    下一篇: Custom table cell not full width of UITableView