这是用MD5加密密码的好办法?(Is this a good way to encrypt pass

2019-07-29 06:31发布

我以前从未加密的密码,这是我想出了这样做,用的帮助下这篇文章 。 本文不包括盐,所以我必须找出自己:

        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被存储在数据库中。 正如你可能注意到了,我遇到了一些麻烦串接字节数组在一起,其中盐参与。 我做了这个权利,或是否有更好的办法? 谢谢。

Answer 1:

密码哈希值应该是缓慢的 ,而不是快。
更快的散列值,更快的攻击者可以通过密码字典运行。

所以,你不应该使用通用哈希SHA一样的密码。

相反,使用像scrypt或证实慢技术PBKDF2 。



Answer 2:

我将只存储盐值和数据库在单独的列散列(不是saltedencryptedPassword),并重新在密码输入的哈希值。 在这里你会找到一个类似的答案在C#哈希和盐密码 。 1 `

我有时只是我们一个GUID作为盐值,并将其散列之前加入到密码。

MD5不是安全的任何延长(由中国在2004年黑客攻击),你可以使用SHA256或SHA512代替。 编辑:然而,这些algorithmes在计算相当快,因此更容易破解。 @SLaks建议使用scrypt或PBKDF2,因为他们更难计算。 有PBKDF2在.NET中内置的实施下Rfc2898DeriveBytes 。

还有一点:我不会创建一个新的随机()对象的时候。 如果短期的时间内把这个随机数的相同的序列,将产生每一次,因为种子值是基于时间的。



Answer 3:

不,这是没有好。 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;
    }
}


Answer 4:

我总是用SHA2-512我的密码散列 。 在我看来,密码不应该被加密,但始终散列(没办法追溯到原始密码)。

但请不再使用MD5,这是很容易在密码翻译回时下。



文章来源: Is this a good way to encrypt passwords with MD5?