Недопустимая длина для массива Base-64 в LINQ TO SQL - PullRequest
1 голос
/ 25 февраля 2012

В настоящее время я работаю над формой входа в систему, но дело в том, что при вводе неверного имени пользователя появляются эти ошибки.

Invalid length for a Base-64 char array.

В этой строке кода:

bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword);

Вот полный код

public void verifyAccount()
        {
            var hashedPassword = getPassword();

            var hasher = new Hasher();

            hasher.SaltSize = 16;
            bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword);

            if (isSame==false)
            {
                MessageBox.Show("Invalid UserName or Password");
            }
            else
            {
                MainWindow main = new MainWindow();
                this.Hide();
                main.ShowDialog();
                this.Close();
            }   
        }

И это метод поиска такого имени пользователя водновременно получая свой пароль, пароль в базе данных.

public string getPassword()
        {

            DataClasses1DataContext myDbContext = new DataClasses1DataContext(dbPath);


            var password = (from user in myDbContext.Accounts
                           where user.accnt_User == txtUser.Text
                           select user.accnt_Pass).FirstOrDefault();

             if (password == null) {
                 return "z"; 
             }

            return password;
        }

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

hasher.CompareStringToHash вероятно ожидает, что hashedPassword будет правильной строкой в ​​кодировке Base64. Используемая вами строка "z" в этом случае недопустима.

Я бы предложил изменить ваш код следующим образом:

    private void VerifyAccount()
    {
        if (!ValidateCredentials(txtUser.Text, txtPassword.Text))
        {
            MessageBox.Show("Invalid user name or password");
        }
    }

    private bool ValidateCredentials(string userName, string password)
    {
        string existingPassword = GetUserPassword(userName);
        if (existingPassword == null)
            return false;

        var hasher = new Hasher { SaltSize = 16 };
        bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword);

        return passwordsMatch;
    }

    private string GetUserPassword(string userName)
    {
        DataClasses1DataContext dataContext = new DataClasses1DataContext();
        var password = (from user in dataContext.Accounts
                        where user.accnt_User == userName
                        select user.accnt_Pass).FirstOrDefault();
        return password;
    }
1 голос
/ 25 февраля 2012

Данные Base64 должны быть выровнены по 4 байта.Так, например, возвращаемое «z» должно быть закодировано в Base64 и дополнено следующим образом: «eg ==» для соответствия Base64.Вы должны выполнить тот же тип заполнения для реального хешированного пароля.

0 голосов
/ 25 февраля 2012

Вы должны просто позволить GetPassword() вернуть null, если пароль не найден.Следующая проблема, однако, заключается в том, что CompareStringToHash() потерпит неудачу, если вы передадите пустой пароль, поэтому вместо

        bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword);

        if (isSame==false)
        {
            MessageBox.Show("Invalid UserName or Password");
        }

вы делаете

        if (hashedPassword == null || hasher.CompareStringToHash(txtPassword.Text, hashedPassword)
        {
            MessageBox.Show("Invalid UserName or Password");
        }

Если hashedPassword равно nullоператор if будет завершен до того, как попытается выполнить CompareStringToHash(), поэтому вы не получите исключение.CompareStringToHash() будет выполняться, только если hashedPassword не null.Затем, при условии, что вы сохранили действительную строку (которая у вас будет, потому что вы создаете ее, будет Encrypto), она должна все работать - и без большого количества грязных if операторов: o)

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