首页 > 解决方案 > 两个散列 md5 代码不返回相同的结果

问题描述

我有两段代码来生成密码,它们都使用 md5 散列算法。我遇到的问题是这两个,尽管它们使用的是散列算法,但它们的输出并不相同。两者都返回一个 32 个字符长的字符串,但结果第一个是小写,第二个是大写。有什么区别?又如何将方法二生成的密码转换为方法一呢?

方法一:

public static string ConvertToMD5Hash(this string password)
        {
            using (var md5 = MD5.Create())
            {
                var result = md5.ComputeHash(Encoding.ASCII.GetBytes(password));
                return result.ToHex(false);
            }
        }

方法二:

FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");

更新:

result method 1: 93db94704e31b49b44452ddb5fcada2c

result method 2: 02EF13AE7287E27CF74D5E3F42A7FCB2

标签: c#asp.netasp.net-coremd5

解决方案


十六进制表示不区分大小写(“1A”==“1a”)。考虑您想要的表示形式,小写或大写,并将另一个转换为该表示形式,或者使比较本身不区分大小写。

至于实际哈希内容的差异,您的问题在于:

Encoding.ASCII.GetBytes(password)

您不应该使用 ASCII 编码,因为这会产生“?” 对于高于代码点 127 的每个输入字符,会导致与使用正确编码时不同的哈希值。

FormsAuthentication.HashPasswordForStoringInConfigFile(),顺便说一句,名字很好,使用 UTF-8,所以:

Encoding.UTF8.GetBytes(password)

此外,使用 MD5 哈希存储密码是 00 年代的一种做法,不应再使用。这是不安全的。不要滚动你自己的密码哈希,尤其是因为你已经标记了问题 ASP.NET Core,只需使用ASP.NET Identity进行身份验证和凭据存储。


推荐阅读