Проверка пароля MD5 всегда возвращает false? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть следующие коды для проверки зашифрованного пароля 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 ]

3 голосов
/ 09 ноября 2010

Не уверен, почему у вас не работает, но когда я написал реализацию SHA512 ниже, у меня были некоторые проблемы с хэшем. Он не выводится так, как вы обычно видите для людей. По этой причине ваш тип данных должен быть двоичным в базе данных. Также вот реализация, которую я использую (с измененной солью), которая использует SHA512. Использование 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();
    }
0 голосов
/ 09 ноября 2010

Был ли пароль в UTF8 до его хеширования и сохранения в UserDAO?

0 голосов
/ 09 ноября 2010

Байт [] находится в базе данных? Можете ли вы записать хэш, когда он входит в базу данных, и записать его, когда вы получите его здесь и посмотреть, равны ли они?

Также обратите внимание, что MD5 считается слабым, и вы не пользуетесь паролями. В случае нарушения данных это может легко привести к взлому учетных записей. Попробуйте использовать SHA1 со случайной солью.

...