MD5CryptoServiceProvider

MD5CryptoServiceProvider

我有一个数据库,其中包含在旧的Identity系统中创建的密码。使用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类在第一种方法中执行的相同字符串。我无法将整个数据库更改为使用新密码。

有什么解决办法吗?

最佳答案

这里有两个问题:

首先,您使用不同的方法将字节数组转换回字符串。在第一种和第二种方法中,您使用

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);
    }
}

关于c# - ASP.NET Core中的MD5CryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40431432/

10-09 08:14