比较哈希编码的密码

本文关键字:密码 编码 哈希 比较 | 更新日期: 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中表示"无效字符"的被替换为普通的"?"在您的数据库中。因此,如果你认为这两个字符相等,你仍然可以比较剩下的密码。