MD5密码检查总是返回false?

时间:2010-11-09 05:27:00

标签: asp.net validation hash passwords md5

我有以下代码来检查md5加密密码与用户输入密码:

            UserDAO userDAO = new UserDAO();

            // encrypt the input password
            MD5 md5 = new MD5CryptoServiceProvider();
            UTF8Encoding encoder = new UTF8Encoding();
            Byte[] encryptedPassword;
            encryptedPassword = md5.ComputeHash(encoder.GetBytes(TxtBoxPassword.Text));

            // get information for this username and begin checking authentication
            DataTable data = userDAO.GetUserInformation(TxtBoxUsername.Text);
            if (data.Rows.Count == 0)
            {
                LblError.Text = "Wrong username!";
                return;
            }
            Byte[] password = (Byte[])data.Rows[0]["Password"];

            if (!Convert.ToBase64String(password).Equals(Convert.ToBase64String(encryptedPassword)))
            {
                LblError.Text = "Wrong password!";
                return;
            }

问题是我可以在我的计算机上正常运行此代码(admin / 123456正确验证),而当我将我的网站发布到服务器时,检查总是返回“密码错误”?是什么给了什么?

3 个答案:

答案 0 :(得分:3)

不确定为什么你的工作不起作用,但是当我编写下面的SHA512实现时,我遇到了一些哈希问题。它不会像您通常看到的那样为人类输出。因此,您的数据类型在数据库中应该是二进制的。这里也是我使用SHA512的实现(使用salt更改)。使用ByteArrayToHexString将其置于人类可识别的格式中。然后,您可以在数据库中使用varchar。

    /// <summary>
    /// Takes a string as input, SHA512 hashes it, and returns the hexadecimal representation of the hash as a string.
    /// </summary>
    /// <param name="toHash">string to be hashed</param>
    /// <returns>hexadecimal representation of the hash as a string</returns>
    private string GetHash(string toHash)
    {
        /* As of this writing, both the –Cng and –CryptoServiceProvider implementation classes are FIPS-certified, 
         * but –Managed classes are not. http://msdn.microsoft.com/en-us/magazine/ee321570.aspx
         */
        // Salt the string
        toHash = "%my" + toHash.Insert(Convert.ToInt16(toHash.Length / 2), "!secret") + ".sauce#";
        SHA512CryptoServiceProvider hasher = new SHA512CryptoServiceProvider();
        byte[] hashBytes = hasher.ComputeHash(Encoding.Unicode.GetBytes(toHash));
        hasher.Clear();
        return ByteArrayToHexString(hashBytes);
    }

    /// <summary>
    /// Takes a byte[] and converts it to its string hexadecimal representation
    /// </summary>
    /// <param name="ba">Array of bytes[] to convert</param>
    /// <returns>string, hexadecimal representation of input byte[]</returns>
    private string ByteArrayToHexString(byte[] ba)
    {
        StringBuilder hex = new StringBuilder(ba.Length * 2);
        foreach (byte b in ba)
            hex.AppendFormat("{0:x2}", b);
        return hex.ToString();
    }

答案 1 :(得分:0)

字节[]是否在数据库中被激活?你可以在进入数据库时​​记录哈希值,并在你在这里获取时记录它并查看它们是否相等吗?

另外,请注意MD5被认为是弱的,并且您没有使用密码。如果发生数据泄露,这很容易导致帐户泄露。考虑将SHA1与随机盐一起使用。

答案 2 :(得分:0)

在密码被哈希并保存到UserDAO之前,密码是否为UTF8?