0

我以前从未加密过密码,这就是我在本文的帮助下想到的。这篇文章不包括盐,所以我不得不自己弄清楚:

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

4

4 回答 4

6

密码哈希应该很,而不是很快。
哈希值越快,攻击者通过密码字典运行的速度就越快。

因此,您永远不应该使用 SHA 之类的通用哈希作为密码。

相反,请使用经过验证的慢速技术,如 scrypt 或PBKDF2

于 2012-05-06T15:28:52.927 回答
0

我将仅将盐值和哈希(不是 saltedencryptedPassword)存储在数据库的单独列中,并使用输入的密码重新生成哈希。您可以在这里找到类似的答案Hash and salt passwords in C#1` _

我有时只是将 GUID 作为盐值,然后在散列之前将其添加到密码中。

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

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

于 2012-05-06T15:13:51.003 回答
-1

不,这不好。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;
    }
}
于 2012-05-06T15:10:45.717 回答
-1

我总是使用 SHA2-512 对我的密码进行哈希处理。在我看来,密码永远不应该被加密,而总是被散列(无法追溯到原始密码)。

但是请不要再使用 MD5,它现在很容易被翻译成密码。

于 2012-05-06T15:15:16.447 回答