比较哈希编码的密码
本文关键字:密码 编码 哈希 比较 | 更新日期: 2023-09-27 17:58:52
我将password
存储在数据库表列中,数据类型为string
。在将其存储到数据库之前,我使用以下c#方法将其制作为Hash encoded
:
public static string Md5Encrypted(string password)
{
byte[] pass = Encoding.UTF8.GetBytes(password);
MD5 md5 = new MD5CryptoServiceProvider();
string strPassword = Encoding.UTF8.GetString(md5.ComputeHash(pass));
return strPassword;
}
现在我想在插入新密码时compare
它。
为此,我从数据库中获取特定用户的记录,并在字符串中获取他现有的编码密码。如果我使用相同的密码,那么它也不匹配。例如,如果我将adgjl135
作为密码传递,它被编码为Pb�ZsÈU��}��
,但从数据库中我得到的是Pb?ZsÈU??}??
,但很明显它们不匹配。那我该如何比较呢?知道吗??
不要这样做:
Encoding.UTF8.GetString(md5.ComputeHash(pass))
计算哈希的结果是而不是UTF-8编码的文本。它是二进制数据。当您试图将其解释为UTF-8编码的字符串时,您会丢失数据,因此会出现问题。
因此,可以将其存储为二进制数据,也可以将其转换为十六进制或base64,这两种数据都可以用于表示任意二进制数据而不会丢失。
(重要的一点是,你应该而不是只使用MD5来散列密码,尤其是不要毫无保留。但这是一个单独的讨论,你肯定应该注意,我没有能力权威地发言。)
正如您可能已经注意到的,通常用于在UTF-8中表示"无效字符"的�
被替换为普通的"?"在您的数据库中。因此,如果你认为这两个字符相等,你仍然可以比较剩下的密码。