比较哈希编码的密码

Dev*_*Dev 1 c# sql-server asp.net sql-server-2008-r2

passwordstring数据类型存储我的数据库表列.在将其存储到数据库之前,我正在Hash encoded使用下面的c#方法:

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;
        } 
Run Code Online (Sandbox Code Playgroud)

现在我想compare插入新密码时想要它.

为此,我从数据库中获取特定用户的记录,并以字符串形式获取其现有的编码密码.如果我使用相同的密码,那么它也不匹配.例如,如果我adgjl135作为密码传递,它被编码为Pb?ZsÈU??}??但是从数据库编码我得到的Pb?ZsÈU??}??但显然它们不匹配.那我该如何比较呢?任何的想法??

Jon*_*eet 6

不要这样做:

Encoding.UTF8.GetString(md5.ComputeHash(pass))
Run Code Online (Sandbox Code Playgroud)

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

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

(作为一个重要的一边,你应该只是使用MD5哈希密码-尤其是没有盐但是,这是一个单独的讨论,一个你应该绝对重视,以及一个在那里我没有资格发言权威性.)

  • @Dev:你*必须*改变.你已经丢失了数据.解决这个问题会比你正确使用MD5更容易受到攻击.从根本上说,你的代码已被破坏 - 破坏的时间越长,修复的代码就越痛苦.您最终可能需要重置每个人的密码.您应该以此为契机来修复您使用的算法以及存储... (2认同)