«Строка или двоичные данные усекаются» при вставке в SQL Server 2008 - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь создать базовое приложение WPF, которое может хранить зашифрованный пароль в SQL Server 2008, а также восстановить пароль, когда пользователь пытается войти в систему, но я получаю сообщение об ошибке после выполнения этой статьи

http://www.dreamincode.net/forums/topic/123865-one-way-encryption/

Я читаю через радужные атаки, соление и перемешивание.

Я попробовал код, но получил ошибку

Я получаю ошибку

строка или двоичные данные будут усечены

Я прочитал эту статью и попытался преобразовать textbox.text в строку, а также попытался ввести только один алфавит в текстовое поле пароля, но все равно не работает («Я изменил connstring по соображениям безопасности, так как connstring работает, и есть нет проблем с этим ")

private void button1_Click(object sender, RoutedEventArgs e)
{
        string strPassword;
        SqlConnection cs= new SqlConnection("Data Source=STEVEJOBS;Initial Catalog=Test database;Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter();
        da.InsertCommand = new SqlCommand("INSERT INTO Member_info(Name,Username,Password,Email,Member) VALUES(@Name,@Username,@Password,@Email,@Member)", cs);
        da.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar).Value = Name_tb.Text;
        da.InsertCommand.Parameters.Add("@Email", SqlDbType.VarChar).Value = Email_tb.Text;
        da.InsertCommand.Parameters.Add("@Username", SqlDbType.VarChar).Value = Username_tb.Text;

        //MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
        //byte[] hashedBytes;
        //UTF8Encoding encoder = new UTF8Encoding();
        //hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPassword));
        //SqlParameter paramPwd;
        //paramPwd = new SqlParameter("@Password", SqlDbType.Binary, 16);
        //paramPwd.Value = hashedBytes;
        //da.InsertCommand.Parameters.Add(paramPwd);

        da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = HashPassword(Password_tb.Text.ToString());
        da.InsertCommand.Parameters.Add("@Member", SqlDbType.NText).Value =Myes_rb.Content ;

        cs.Open();

        da.InsertCommand.ExecuteNonQuery();

        cs.Close();
        MessageBox.Show("Sucessfully added");
    }

    static string HashPassword(string pasword)
{
           byte[] arrbyte = new byte[pasword.Length];
           SHA256 hash = new SHA256CryptoServiceProvider();
           arrbyte = hash.ComputeHash(Encoding.UTF8.GetBytes(pasword));
           return Convert.ToBase64String(arrbyte);
    }

Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Эта ошибка появляется при попытке вставить строку с большим количеством символов, чем указано в определении столбца. Сделайте ваши строковые столбцы шире.

Чтобы определить столбец, который вызывает эту ошибку, вы можете изменить свой оператор INSERT, удалив параметры один за другим (удалите строку da.InsertCommand.Parameters.Add для этого столбца, а в части VALUES оператора INSERT поместите константу, например 'John').

EDIT # 1:

Продолжайте удалять столбцы один за другим (как вы сделали с столбцом пароля) и как только инструкция вставки не завершится неудачей, вы узнаете, какой столбец вызвал ошибку. Затем выполните отладку, чтобы узнать длину значения, которое вы назначаете для (ошибочного) параметра столбца. Длина этого столбца в базе данных должна быть> = длины значения, которое вы пытаетесь вставить.

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

EDIT # 2:

Используйте Пароль свойство, чтобы получить текст, введенный пользователем:

    da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = 
        HashPassword(Password_tb.Password);

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

    string pwdHash = HashPassword(Password_tb.Password);
    da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = pwdHash;

Поставьте точку останова во второй строке и проверьте длину строки pwdHash. Столбец пароля в таблице базы данных должен быть не меньше этой длины.

0 голосов
/ 24 ноября 2011

Хорошо, вы полностью выключены. У тебя тонны проблем. Давайте начнем:

Я пытаюсь создать базовое приложение WPF, которое может хранить зашифрованный пароль в SQL SERVER 2008, а также восстановить пароль, когда пользователь пытается войти, но я получаю ошибка после следования этой статье http://www.dreamincode.net/forums/topic/123865-one-way- Шифрование /

Fail, уволен. Видите, хэширование в одном направлении (НЕ шифрование) называется так, потому что это один способ. НЕТ СПОСОБА ПОЛУЧИТЬ ПАРОЛЬ БЕЗ РАЗРЫВА. Программа никогда не будет работать.

также пытался набрать только один алфавит в текстовом поле пароля, но все равно не работает

Прочитайте документацию, как работает соление. SHA преобразует входные данные в двоичный случайный номер определенной длины. Абсолютно неважно, вводите ли вы пароль длиной 1 или 1000 символов, результатом всегда будет двоичный код с фиксированной длиной.

return Convert.ToBase64String (arrbyte);

Это довольно нерегулярно. Большинство людей преобразуют массивы в HEX (фиксированной длины, легко читаемые / записываемые для отладки) и используют это.

Так или иначе, запишите ДЛИНУ строки, которую вы возвращаете сюда. Проверьте все параметры, которые вы вводите, против структуры таблицы. Закончено.

И вы все еще не справились с домашним заданием - SHA не восстанавливается без взлома.

базовое приложение WPF, которое может хранить зашифрованный пароль в SQL SERVER 2008, а также восстановить пароль, когда пользователь попытается войти

никогда не будет достигнуто с таким подходом.

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