Использование ExecuteSqlCommand заставляет мой пароль не работать при вставке в БД - PullRequest
0 голосов
/ 11 октября 2018

Я использую MySql DB и пытаюсь создать там пользователя.Пароль - это хеш.Когда я использую Context.Useraccount.add (User) и Context.SaveChanges (), добавление в базу данных работает нормально, но использование ExecuteSqlCommmand делает пароль неработоспособным.

var sql = @"INSERT INTO useraccount
           (UserId,UserName,Password,CustomerId,PasswordSalt,CreatedDate)
                VALUES
                (@UserId, @UserName,@Password,@CustomerId, @PasswordSalt, @CreatedDate)";

        int rows = _context.Database.ExecuteSqlCommand(
                sql,
                new MySqlParameter("@UserId", user.UserId),
                new MySqlParameter("@UserName", user.UserName),
                new MySqlParameter("@Password", user.Password),
                new MySqlParameter("@CustomerId", user.CustomerId),
                new MySqlParameter("@PasswordSalt", user.PasswordSalt),
                new MySqlParameter("@CreatedDate", MySQLFormatDate));

Это дает следующее исключение: {MySql.Data.MySqlClient.MySqlException (0x80004005): Неверное строковое значение: '\ x90] \ x0E \ x80 \ xB1 \ xFF ...' для столбца «Пароль» в строке 1 ---> MySql.Data.MySqlClient.MySqlException(0x80004005): Неверное строковое значение: '\ x90] \ x0E \ x80 \ xB1 \ xFF ...' для столбца 'Пароль' в строке 1

Я попытался изменить значение столбца в БД на varbinary (из varchar), а затем я могу вставить его, но он становится большим двоичным объектом в БД и не работает, когда я пытаюсь прочитать его снова.

Как правильно отправить хэш в БД?

Редактировать --- код для создания хэша

 private static void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt)
    {
        if (password == null) throw new ArgumentNullException("password");
        if (string.IsNullOrWhiteSpace(password)) throw new ArgumentException("Value cannot be empty or whitespace only string.", "password");

        using (var hmac = new System.Security.Cryptography.HMACSHA512())
        {
            passwordSalt = hmac.Key;
            passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
        }
    }

edit2 --- типы пароля - байты []

Это если я изменю пароль иТипы SaltedPassword в базе данных для VarBinary.Когда я использую VarChar, он выдает ошибку, которую я вставил ранее, и ничего не отправляется в БД.

Текстовое изображение

ОБНОВЛЕНИЕ - РЕШЕНО

Таким образом, у меня было неверное значение в modelbuilder.entity для пароля, который у меня был VarChar, когда он должен был быть VarBinary.Каким-то образом это работало с Context.Useraccount.add (Пользователь) и Context.SaveChanges (), хотя.

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

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Хэши паролей являются байтовыми массивами и не могут быть сохранены в строке C #.Они также должны храниться в столбце BINARY (или VARBINARY) в базе данных, а не в столбце VARCHAR.

, но он становится большим двоичным объектом в БД, и он не 'не работает, когда я пытаюсь прочитать его снова

Чтобы проверить пароль пользователя, вы должны прочитать обратно соль пароля (как byte[]), хешировать пароль (в виде простого текста) с той же солью, затем сравните вновь созданный хеш с хешем пароля, полученным из базы данных (как byte[]).Не пытайтесь преобразовать хэш пароля обратно в C # string.

0 голосов
/ 11 октября 2018

Перефразируя ответ из этого ответа, поскольку он также применим к вашей ситуации

"Неверное значение строки" при попытке вставить UTF-8 в MySQL через JDBC?

Кодировка MySql utf8 поддерживает только символы, которые могут быть закодированы в 3 байта.Какой бы символ '\ x90] \ x0E \ x80 \ xB1 \ xFF', вероятно, занимает более 3 байтов для кодирования, и именно поэтому MySql кричит на вас.

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

Я не вижу ваш метод для их хеширования, но это гарантирует, что вы кодируете, используя utf8

   byte[] salt = // Salt
   byte[] encodedValue = Encoding.UTF8.GetBytes(value);
   byte[] saltedValue = value.Concat(salt).ToArray();
   byte[] hashedValue = SHA256Managed().ComputeHash(saltedValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...