c# - 两个散列 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
解决方案
十六进制表示不区分大小写(“1A”==“1a”)。考虑您想要的表示形式,小写或大写,并将另一个转换为该表示形式,或者使比较本身不区分大小写。
至于实际哈希内容的差异,您的问题在于:
Encoding.ASCII.GetBytes(password)
您不应该使用 ASCII 编码,因为这会产生“?” 对于高于代码点 127 的每个输入字符,会导致与使用正确编码时不同的哈希值。
FormsAuthentication.HashPasswordForStoringInConfigFile()
,顺便说一句,名字很好,使用 UTF-8,所以:
Encoding.UTF8.GetBytes(password)
此外,使用 MD5 哈希存储密码是 00 年代的一种做法,不应再使用。这是不安全的。不要滚动你自己的密码哈希,尤其是因为你已经标记了问题 ASP.NET Core,只需使用ASP.NET Identity进行身份验证和凭据存储。
推荐阅读
- python-3.x - 使用存储在 Python 中的变量中的值重命名文件
- kubernetes - 如何在 Helm 3 中使用 imagePullSecrets: []
- c++ - 在派生函数中指定 void* 参数
- node.js - 在 Node.js 中使用 i++ 时的全局变量安全性
- python - 断言失败:使用 SVM、OpenCV、数字识别
- excel - 我需要使用什么公式才能将一个单元格中的文本从工作表链接到另一个工作表中的单元格?
- c# - 如何在ObjectListView C#中每四个单词后画一条线
- postgresql - 如何在连接上设置 transform_null_equals postgres 参数?
- laravel - Laravel 控制器中的权限
- json - Kibana Query DSL:如何在包含 JSON 语法的文本值字段上应用正则表达式过滤器