比较哈希编码的密码

时间:2013-02-13 10:34:46

标签: c# asp.net sql-server sql-server-2008-r2

我将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??}??,但很明显它们不匹配。那我该如何比较呢?任何的想法??

2 个答案:

答案 0 :(得分:6)

不要这样做:

Encoding.UTF8.GetString(md5.ComputeHash(pass))

计算哈希的结果是不是 UTF-8编码的文本。这是二进制数据。当您尝试将其解释为UTF-8编码的字符串时,您会丢失数据 - 因此会出现问题。

因此要么将其存储为二进制数据,要么将其转换为十六进制或base64,这两者都可用于表示任意二进制数据而不会丢失。

(作为一个重要的一点,你应该只使用MD5哈希密码 - 特别是没有盐。但这是一个单独的讨论,你应该肯定支付注意,以及我无权说话的权利。)

答案 1 :(得分:0)

正如您可能已经注意到的那样,(通常用于表示UTF-8中的“无效字符”)会被普通的'?'取代。在您的数据库中。因此,如果您认为这两个字符相同,您仍然可以比较密码的左边。