【问题标题】:Secure Password Programming with .NET使用 .NET 进行安全密码编程
【发布时间】:2012-01-26 07:02:27
【问题描述】:

我想将安全密码转换为安全哈希码。最好的方法?

like: SHA1,MD5 和任意组合?

string str ="Krishna";

Output:"!#$!$ASDFAS@#$%@";

【问题讨论】:

    标签: c# asp.net encryption cryptography md5


    【解决方案1】:

    有多种方法可以创建可用于加盐的随机数据。最常见的是:

    • 使用 Guid 类型创建随机 GUID
    • 使用RNGCryptoServiceProvider 类创建随机数字字符串

    为了创建一个新的随机 GUID,我们在 Guid 类型上调用 NewGuid 方法。生成后,我们只需将盐附加到要加密的字符串。

    string saltAsString = Guid.NewGuid().ToString();
    

    为了使用RNGCryptoServiceProvider 类创建随机数字字符串,我们首先初始化一个提供程序和一个byte 数组,然后在我们的提供程序实例上调用GetBytes 方法。

    byte[] saltInBytes = new byte[8];
    RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
    saltGenerator.GetBytes(saltInBytes);
    string saltAsString = Convert.ToBase64String(saltInBytes);
    

    以下代码是之前sn-p的修改版,用于演示加盐。

    public void HashText()
    {
        string textToHash = "password"; 
        string saltAsString = Guid.NewGuid().ToString();
        byte[] byteRepresentation 
            = UnicodeEncoding.UTF8.GetBytes(textToHash + saltAsString);
    
        byte[] hashedTextInBytes = null; 
        MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider();
        hashedTextInBytes = myMD5.ComputeHash(byteRepresentation); 
        string hashedText = Convert.ToBase64String(hashedTextInBytes); 
    
        // will display X03MO1qnZdYdgyfeuILPmQ==
        MessageBox.Show(hashedText);
    }
    

    【讨论】:

    • 一个更好的主意是使用像 PBKDF2 这样的内置密钥派生原语,而不是自己发明。
    【解决方案2】:
    public static string Cipher(object obj)
    {
        string j = JSON(obj);
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = System.Text.Encoding.UTF8.GetBytes("salt");
            aesAlg.IV = System.Text.Encoding.UTF8.GetBytes("salt");
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(j);
                    }
                    byte[] encrypted = msEncrypt.ToArray();
                    return Convert.ToBase64String(encrypted).Replace('/', '-').Replace('+', '_').Replace("=", "");
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是默认会员提供者所做的:

       internal string EncodePassword(string pass)
          {
              string salt = GenerateSalt();
      
              byte[] bytes = Encoding.Unicode.GetBytes(pass);
              byte[] src = Convert.FromBase64String(salt);
              byte[] dst = new byte[src.Length + bytes.Length];
              Buffer.BlockCopy(src, 0, dst, 0, src.Length);
              Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
              HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
              byte[] inArray = algorithm.ComputeHash(dst);
      
              return Convert.ToBase64String(inArray);
          }
      
          internal string GenerateSalt()
          {
              RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
              byte[] buff = new byte[32];
              rng.GetBytes(buff);
              return Convert.ToBase64String(buff);
          }
      

      【讨论】:

        【解决方案4】:

        我强烈建议使用 BCrypt 之类的东西,而不是 SHA1。使用 SHA1 不是存储密码的好方法,因为它很容易受到字典攻击,即使使用盐也是如此。 SHA1 是一种快速算法,旨在快速处理大量数据。甚至可以在更旧的计算机上计算 millions of hashes per second

        BCrypt 使用修改后的加密算法和盐,这使得通过使用称为工作因子的东西来计算单个散列变得昂贵。它利用了攻击者需要计算许多哈希值的事实,而对于合法验证,您只需要计算一个。

        另请阅读优秀文章How to Safely Store a Password 以获得更深入的解释。

        【讨论】:

          猜你喜欢
          • 2017-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2012-11-29
          相关资源
          最近更新 更多