Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是使用MD5加密密码的好方法吗?_C#_Encryption_Passwords_Md5 - Fatal编程技术网

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

C# 这是使用MD5加密密码的好方法吗?,c#,encryption,passwords,md5,C#,Encryption,Passwords,Md5,我以前从来没有加密过密码,这就是我想出的方法,借助于。这篇文章不包括盐,所以我必须自己弄清楚: UTF8Encoding encoder = new UTF8Encoding(); byte[] salt = new byte[8]; new Random().NextBytes(salt); byte[] encodedPassword = encoder.GetBytes(txtPassword.Text); b

我以前从来没有加密过密码,这就是我想出的方法,借助于。这篇文章不包括盐,所以我必须自己弄清楚:

        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
存储在数据库中。正如您可能注意到的,我在连接涉及salt的字节数组时遇到了一些问题。我做得对吗,还是有更好的方法?谢谢。

不,不好。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;
    }
}

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

我只将salt值和散列(不是saltedencryptedPassword)存储在数据库中的不同列中,并使用键入的密码重新生成散列。你可以在这里找到类似的答案`

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

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


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

我将仅在数据库中的单独列中存储salt值和散列(而不是saltedencryptedPassword),并使用键入的密码重新生成散列。你可以在这里找到类似的答案`

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

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


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

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


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

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


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

密码哈希应该是慢的,而不是快的。
散列越快,攻击者通过密码字典的速度就越快

因此,永远不要使用像SHA这样的通用哈希作为密码


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

密码哈希应该是慢速的,而不是快速的。
散列越快,攻击者通过密码字典的速度就越快

因此,永远不要使用像SHA这样的通用哈希作为密码


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

使用MD5加密密码没有好方法。您应该使用scrypt或PBKDF2散列密码。使用MD5无法加密密码。这是一个单向散列函数,不是加密算法。很难跟上这里的变化。随着计算能力的提高,破解一些较弱的方法变得更容易。虽然MD5在过去是足够的,但是有一些新的方法需要更高的计算能力才能打破。除了在PBKDF2、bcrypt或scrypt上选择MD5显然是错误的之外,你的盐析方法也很糟糕。对您的salt使用加密PRNG,而不是当前时间。重复一下SLaks要点:单次迭代SHA-2和MD5一样错误,所以我否决了所有建议的答案。使用MD5加密密码没有好方法。您应该使用scrypt或PBKDF2散列密码。使用MD5无法加密密码。这是一个单向散列函数,不是加密算法。很难跟上这里的变化。随着计算能力的提高,破解一些较弱的方法变得更容易。虽然MD5在过去是足够的,但是有一些新的方法需要更高的计算能力才能打破。除了在PBKDF2、bcrypt或scrypt上选择MD5显然是错误的之外,你的盐析方法也很糟糕。对你的salt使用加密PRNG,而不是当前时间。重复一下SLaks要点:单次迭代SHA-2和MD5一样错误,所以我否决了所有建议的答案。不,不,不。使用salt。沙太快了。不要吞下异常。@SLaks+1,永远不要吞下异常,而且永远不要捕获
System.Exception
。那么“太快”呢?我不是专家,你能解释一下为什么这是个问题吗?在这个特定的示例中,如果由于某种原因出现错误,我需要返回空字符串,但不记得为什么…:)@Qmal:SHA经过优化,运行速度极快。这意味着攻击者可以在暴力攻击中每秒尝试数百万个密码。那不好。不,不,不。用盐。沙太快了。不要吞下异常。@SLaks+1,永远不要吞下异常,而且永远不要捕获
System.Exception
。那么“太快”呢?我不是专家,你能解释一下为什么这是个问题吗?在这个特定的示例中,如果出现错误,我需要返回空字符串