md5加密字符串返回的值与插入的值不同

本文关键字:插入 加密 返回 md5 字符串 | 更新日期: 2023-09-27 18:16:54

所以,我试着检查密码是否匹配。

这是我使用的加密,一次当数据插入到数据库中,一次检查登录字段上插入的密码是否与数据库中的密码匹配:

 byte[] pass = Encoding.UTF8.GetBytes(password);
 MD5 md5 = new MD5CryptoServiceProvider();
 string newPass = Encoding.UTF8.GetString(md5.ComputeHash(pass));

但是每次我尝试登录(使用正确的详细信息),它不工作。在调试器中,这是来自数据库的字符串:

?]??$PL??f??6?

和从登录字段加密的那个:

�]��$PL��fඇ�6�

我想这是编码问题,但我自己也搞不清楚。

md5加密字符串返回的值与插入的值不同

这一行不合适:

string newPass = Encoding.UTF8.GetString(md5.ComputeHash(pass));

ComputeHash返回任意二进制数据。要么你应该把它作为二进制数据,要么如果你确实需要将其转换为文本,使用Base64将其转换为一种允许你稍后返回原始数据的方式:

string base64Hash = Convert.ToBase64String(md5.ComputeHash(pass));

您应该可以将其存储为普通字符串-它将只是ASCII。

(我个人不会使用MD5来散列密码,但这是另一回事。)

ComputeHash方法返回一个字节数组,而不是一个编码字符数组。

GetString方法需要一个编码字符数组作为输入,不是任意字节数组。

如果newPass是一个字符串,那么您需要将任意字节数组转换为一种格式,该格式可以正确地将任意字节数组表示为字符串。例如,Base-64编码:

string newPass - Convert.ToBase64String(md5.ComputeHash(pass));

猜测,但数据库字段是CHAR或VARCHAR而不是NCHAR或NVARCHAR?'N'变体是Unicode(以及如何编码btyes),就像。net字符串。

可以看到,两种情况下的可读字符是相同的(可以清楚地看到$PL突出在中间)。由于这是md5哈希的结果,您可以假设输入数据是相等的。

第一行看起来像是被转换为ASCII而不是UTF8,其中所有非ASCII字符都被更改为?

如果我是你,我不会尝试将二进制数据(md5输出)直接转换为字符串,而是使用十六进制表示,例如:

StringBuilder result = new StringBuilder();
foreach (byte b in md5hash) 
{
    result.Append(b.ToString("X2"));
}