在C#中用密码保存DB的MD5哈希

你可以给我build议一些简单的algorithm,用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); } 

您可以使用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都是字节数组。

如果你有string,你必须先把它们转换成字节:

 var salt = System.Text.Encoding.UTF8.GetBytes("my salt"); var password = System.Text.Encoding.UTF8.GetBytes("my password"); 

这是一个示例 。 它处理MD5,SHA1,SHA256,SHA384和SHA512。

除了上面提到的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。

微软已经为你完成了这项工作,但需要一点挖掘。 安装Web Service Extensions 3.0,并查看带有Reflector的Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest函数。

我想在这里发布这个函数的源代码,但我不确定这是否合法。 如果任何人都可以放心,我会这样做。