使用.NET进行安全密码编程

时间:2012-01-26 07:02:28

标签: c# asp.net encryption cryptography md5

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

喜欢:SHA1,MD5和任何组合?

string str ="Krishna";

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

4 个答案:

答案 0 :(得分:4)

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

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

要创建新的随机GUID,我们会调用NewGuid类型的Guid方法。生成后,我们只需将salt附加到要加密的字符串即可。

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

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

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

以下代码是上一个代码片段的修改版本,用于演示salting。

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);
}

答案 1 :(得分:1)

这是默认的会员提供商所做的事情:

 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);
    }

答案 2 :(得分:1)

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 :(得分:1)

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

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

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