ASP.NET Core中的MD5CryptoServiceProvider

Yur*_*les 7 c# encryption asp.net-core

我有一个数据库,其中包含在旧身份系统中创建的密码.使用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);
}
Run Code Online (Sandbox Code Playgroud)

我在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);
}
Run Code Online (Sandbox Code Playgroud)

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("-", "");
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个方法都没有返回MD5CryptoServiceProvider类在第一个方法中执行的相同字符串.我无法更改整个数据库以使用新密码.

有什么解决方法吗?

Bre*_*ton 18

这里有两个问题:

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

return Encoding.ASCII.GetString(data);
Run Code Online (Sandbox Code Playgroud)

在第三种方法中,您使用:

var strResult = BitConverter.ToString(result);
return strResult.Replace("-", "");
Run Code Online (Sandbox Code Playgroud)

这些不会输出相同的结果.

其次,虽然在第一和第三示例中使用的散列函数确实相同,但第二示例中使用的方法不是.

简而言之,要获得所需内容,请使用第三个选项,但使用相同的方法将其转换回您在第一个示例中使用的字符串(如果这是您之前使用的那个):

public static string MD5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
        return Encoding.ASCII.GetString(result);
    }
}
Run Code Online (Sandbox Code Playgroud)


ADM*_*-IT 5

这是我的 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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,MD5 已过时且不安全。请在未来的项目中使用不同的哈希函数(请参阅如何对密码进行哈希处理)。