我将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??}??
,但很明显它们不匹配。那我该如何比较呢?任何的想法??
答案 0 :(得分:6)
不要这样做:
Encoding.UTF8.GetString(md5.ComputeHash(pass))
计算哈希的结果是不是 UTF-8编码的文本。这是二进制数据。当您尝试将其解释为UTF-8编码的字符串时,您会丢失数据 - 因此会出现问题。
因此要么将其存储为二进制数据,要么将其转换为十六进制或base64,这两者都可用于表示任意二进制数据而不会丢失。
(作为一个重要的一点,你应该不只使用MD5哈希密码 - 特别是没有盐。但这是一个单独的讨论,你应该肯定支付注意,以及我无权说话的权利。)
答案 1 :(得分:0)
正如您可能已经注意到的那样,�
(通常用于表示UTF-8中的“无效字符”)会被普通的'?'取代。在您的数据库中。因此,如果您认为这两个字符相同,您仍然可以比较密码的左边。