这是用MD5加密密码的好方法吗?

我之前从未加密过密码,这是我在这篇文章的帮助下想到的。 这篇文章没有包括盐,所以我不得不自己解决:

UTF8Encoding encoder = new UTF8Encoding(); byte[] salt = new byte[8]; new Random().NextBytes(salt); byte[] encodedPassword = encoder.GetBytes(txtPassword.Text); byte[] saltedPassword = new byte[8 + encodedPassword.Length]; System.Buffer.BlockCopy(salt, 0, saltedPassword, 0, 8); System.Buffer.BlockCopy(encodedPassword, 0, saltedPassword, 8, encodedPassword.Length); byte[] encryptedPassword = new MD5CryptoServiceProvider().ComputeHash(saltedPassword); byte[] saltedEncryptedPassword = new byte[8 + encryptedPassword.Length]; System.Buffer.BlockCopy(salt, 0, saltedEncryptedPassword, 0, 8); System.Buffer.BlockCopy(encryptedPassword, 0, saltedEncryptedPassword, 8, encryptedPassword.Length); 

saltedEncryptedPassword存储在数据库中。 正如您可能注意到的那样,在将涉及盐的字节数组连接在一起时遇到了一些麻烦。 我做得对吗,还是有更好的方法? 谢谢。

密码哈希应该很 ,而不是快。
哈希越快,攻击者可以通过密码字典运行得越快。

因此,您永远不应该使用像SHA这样的通用哈希来表示密码。

相反,使用scrypt或PBKDF2等经过validation的慢速技术。

我只将salt值和哈希值(不是saltedencryptedPassword)存储在数据库的不同列中,并使用键入的密码重新生成哈希值。 你在C#中找到了类似的答案Hash和salt密码 。 1`

我有时只将GUID作为salt值并在散列之前将其添加到密码中。

MD5不再安全(2004年被中文黑客攻击),你可以用SHA256或SHA512代替。 编辑:然而,这些算法计算速度非常快,因此更容易破解。 @SLaks建议使用scrypt或PBKDF2,因为它们更难计算。 在Rfc2898DeriveBytes下,.NET中有一个内置的PBKDF2实现。

另一点:我不会每次都创建一个新的Random()对象。 如果您在短时间内调用此项,则每次都会生成相同的随机数序列,因为种子值是基于时间的。

不,这不好。 MD5不再好了。 它与自身相撞而不被信任。 你应该使用SHA256。

 public string getSHA256(string input) { try { return BitConverter.ToString(SHA256Managed.Create().ComputeHash(Encoding.Default.GetBytes(input))).Replace(“-”, “”).ToLower(); } catch (Exception e) { return string.Empty; } } 

我总是使用SHA2-512来记录我的密码。 在我看来,密码永远不应该加密,但总是哈希(无法追溯到原始密码)。

但请不要再使用MD5,现在可以轻松将其翻译回密码。