18

您能否告诉我一些通过 MD5 散列用户密码的简单算法,但使用来提高可靠性。

现在我有了这个:

private static string GenerateHash(string value)
{
    var data = System.Text.Encoding.ASCII.GetBytes(value);
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
    return Convert.ToBase64String(data);
}
4

3 回答 3

40

您可以使用HMACMD5类:

var hmacMD5 = new HMACMD5(salt);
var saltedHash = hmacMD5.ComputeHash(password);

也适用于 SHA-1、SHA256、SHA384、SHA512 和 RIPEMD160:

var hmacSHA1 = new HMACSHA1(salt);
var saltedHash = hmacSHA1.ComputeHash(password);

两者saltpassword都应为字节数组。

如果您有字符串,则必须先将它们转换为字节:

var salt = System.Text.Encoding.UTF8.GetBytes("my salt");
var password = System.Text.Encoding.UTF8.GetBytes("my password");
于 2009-08-19T15:55:20.483 回答
4

除了上面提到的 HMACSHA1 类,如果你只需要一个快速的加盐哈希,那么你已经完成了 95% 的工作:

private static string GenerateHash(string value, string salt)
{
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value);
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
    return Convert.ToBase64String(data);
}

真正的诀窍是将盐存储在安全的位置,例如您的 machine.config。

于 2009-08-19T16:24:57.053 回答
1

Microsoft 已经为您完成了这项工作,但需要进行一些挖掘。安装Web Service Extensions 3.0,看看Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigestReflector的功能。

我想在这里发布该函数的源代码,但我不确定这样做是否合法。如果有人可以让我放心,那么我会这样做。

于 2009-08-19T16:10:08.440 回答