Итак, я использую пакет MySql .Data для моего. NET Core проекта и храню хэши и соли паролей (типа byte[]
) как varbinary()
в базе данных. При выборе пароля ha sh и соли от пользователя мне нужен способ преобразовать результат обратно в массив байтов. Учитывая этот пример кода
Stream passwordHashStream = dbDataReader.GetStream(0);
byte[] passwordHash;
using (MemoryStream memoryStream = new MemoryStream())
{
await passwordHashStream.CopyToAsync(memoryStream);
passwordHash = memoryStream.ToArray();
}
, первая строка вызовет это исключение
System.IndexOutOfRangeException: индекс данных должен быть допустимым индексом в поле MySql .Data. MySqlClient.Interceptors.ExceptionInterceptor.Throw (исключение исключения) в MySql .Data.MySqlClient.MySqlConnection.Throw (Exception ex) в MySql .Data.MySqlClient.MySqlDataReader.Throw (Exception * .Data) в * 1028 MySqlClient.MySqlDataReader.GetBytes (Int32 i, Int64 fieldOffset, Byte [] buffer, Int32 bufferoffset, Int32 length) в System.Data.Common.DbDataReader.GetStream (порядковый номер Int32) в Infrastructure.Persistence.Repositories.UsersRepository29. <> * 10 *. d.MoveNext () в /.../Infrastructure/Persistence/Repositories/UsersRepository.cs:line 60
, хотя считыватель содержит правильные результаты базы данных, как вы можете видеть здесь ниже (пароль 32 байта, ha sh равно 16 байтам)
The error was reported in 2018
https://bugs.mysql.com/bug.php?id=93374
и имеет проверенный статус. Есть ли хорошие решения / обходные пути, как решить эту проблему? Я не хочу использовать метод GetBytes
, потому что он требует, чтобы я передавал длину массива байтов, и я хотел бы оставаться независимым от этого.