我想在安全哈希码中转换安全密码。最好的方法?
喜欢:SHA1,MD5和任何组合?
string str ="Krishna";
Output:"!#$!$ASDFAS@#$%@";
答案 0 :(得分:4)
有多种方法可以创建可用于腌制的随机数据。最常见的是:
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以获得更深入的解释。