ASP中的MD5CryptoServiceProvider净的核心

本文关键字:核心 MD5CryptoServiceProvider 中的 ASP | 更新日期: 2023-09-27 18:16:28

我有一个在旧身份系统中创建的密码数据库。使用MD5CryptoServiceProvider类对密码进行散列。我现在需要在ASP中使用这些密码。. NET MVC核心,但MD5CryptoServiceProvider不存在。

在。net框架中,我用来计算哈希值的函数是:
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核心:

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类在第一个方法中返回的字符串。我不能更改整个数据库来使用新密码。

有什么解决办法吗?

ASP中的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);
    }
}

这是我的md5 helper版本

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

请注意MD5已过时且不安全。请在以后的项目中使用不同的散列函数(参见如何散列密码)。