Проверка пароля с использованием хешированного пароля - PullRequest
0 голосов
/ 05 декабря 2018

У меня была проблема, как я могу решить проблему.Когда я пытаюсь проверить пароль из базы данных, что-то не работает.Хеш-пароль хранится в базе данных.

В отдельном файле есть класс хеширования пароля:

public static string ComputeHash(string plainText, byte[] salt)
{
    int minSaltLength = 4, maxSaltLength = 16;
    byte[] SaltBytes = null;
    if (salt != null)
    {
        SaltBytes = salt;
    }
    else
    {
        Random r = new Random();
        int SaltLength = r.Next(minSaltLength, maxSaltLength);
        SaltBytes = new byte[SaltLength];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetNonZeroBytes(SaltBytes);
        rng.Dispose();
    }
    byte[] plainData = ASCIIEncoding.UTF8.GetBytes(plainText);
    byte[] plainDataWithSalt = new byte[plainData.Length + SaltBytes.Length];
    for (int x = 0; x < plainData.Length; x++)
    {
        plainDataWithSalt[x] = plainData[x];
    }
    for (int n = 0; n < SaltBytes.Length; n++)
    {
        plainDataWithSalt[plainData.Length + n] = SaltBytes[n];
    }
    byte[] hashValue = null;
    SHA512Managed sha = new SHA512Managed();
    hashValue = sha.ComputeHash(plainDataWithSalt);
    sha.Dispose();
    byte[] result = new byte[hashValue.Length + SaltBytes.Length];
    for (int x = 0; x < hashValue.Length; x++)
    {
        result[x] = hashValue[x];
    }
    for (int n = 0; n < SaltBytes.Length; n++)
    {
        result[hashValue.Length + n] = SaltBytes[n];
    }
    return Convert.ToBase64String(result);
}

public static bool Confirm(string plainText, string hashValue)
{
    byte[] hashBytes = Convert.FromBase64String(hashValue);
    int hashSize = 64;
    byte[] saltBytes = new byte[hashBytes.Length - hashSize];
    for (int x = 0; x < saltBytes.Length; x++)
    {
        saltBytes[x] = hashBytes[hashSize + x];
    }
    string newHash = ComputeHash(plainText, saltBytes);
    return (hashValue == newHash);
}

В этом классе я работаюс базой данных (в ней хранятся хранимые процедуры):

public Boolean CheckLoginTeacher(string login, string password)
{
    bool check = false;
    SqlConnection sqlConnection = new SqlConnection(connectionString);
    string sql = "BooleanTeachers";
    try
    {
        sqlConnection.Open();
        SqlCommand sqlCommand = new SqlCommand(sql, sqlConnection)
        {
            CommandType = System.Data.CommandType.StoredProcedure
        };
        SqlParameter sqlParameter = new SqlParameter
        {
            ParameterName = "@login",
            Value = login
        };
        sqlCommand.Parameters.Add(sqlParameter);
        sqlParameter = new SqlParameter
        {
            ParameterName = "@password",
            Value = password
        };
        sqlCommand.Parameters.Add(sqlParameter);
        SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
        while (sqlDataReader.Read()) //here it shows false, then closes the connection
        {
            if (EncryptonDecrypt.Confirm(login, sqlDataReader.GetValue(0).ToString()) && EncryptonDecrypt.Confirm(password, sqlDataReader.GetValue(1).ToString()))
            {
                check = true;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        sqlConnection.Close();
    }
    return check;
}

Как решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...