我有一个在旧身份系统中创建密码的数据库。密码使用MD5CryptoServiceProvider
类进行哈希处理。我现在需要在ASP.NET MVC Core中使用这些密码,但MD5CryptoServiceProvider
不存在。
在.NET Framework中,我用来计算哈希的函数是:
public static string CreateHash(string unHashed)
{
var x = new System.Security.Cryptography.MD5CryptoServiceProvider();
var data = Encoding.ASCII.GetBytes(unHashed);
data = x.ComputeHash(data);
return Encoding.ASCII.GetString(data);
}
我在ASP.NET Core中尝试了以下两个函数:
public static string CreateHash(string unHashed)
{
var x = new System.Security.Cryptography.HMACMD5();
var data = Encoding.ASCII.GetBytes(unHashed);
data = x.ComputeHash(data);
return Encoding.ASCII.GetString(data);
}
和
public static string MD5Hash(string input)
{
using (var md5 = MD5.Create())
{
var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
var strResult = BitConverter.ToString(result);
return strResult.Replace("-", "");
}
}
两个方法都没有返回MD5CryptoServiceProvider
类在第一个方法中执行的相同字符串。我无法更改整个数据库以使用新密码。
对此有任何解决方法吗?
答案 0 :(得分:18)
这里有两个问题:
首先,您使用不同的方法将字节数组转换回字符串。在第一种和第二种方法中,使用
return Encoding.ASCII.GetString(data);
在第三种方法中,您使用:
var strResult = BitConverter.ToString(result);
return strResult.Replace("-", "");
这些不会输出相同的结果。
其次,虽然在第一和第三示例中使用的散列函数确实相同,但第二示例中使用的方法不是。
简而言之,要获得您想要的内容,请使用第三个选项,但使用相同的方法将其转换回您在第一个示例中使用的字符串(如果这是您之前使用的那个):
public static string MD5Hash(string input)
{
using (var md5 = MD5.Create())
{
var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
return Encoding.ASCII.GetString(result);
}
}
答案 1 :(得分:3)
这是我的md5助手版本
public static string ToMD5Hash(this string str)
{
if (string.IsNullOrEmpty(str))
return null;
return Encoding.ASCII.GetBytes(str).ToMD5Hash();
}
public static string ToMD5Hash(this byte[] bytes)
{
if (bytes == null || bytes.Length == 0)
return null;
using (var md5 = MD5.Create())
{
return string.Join("", md5.ComputeHash(bytes).Select(x => x.ToString("X2")));
}
}