Почему строки, которые EF извлекает, отличаются от тех, которые на самом деле находятся в базе данных? - PullRequest
0 голосов
/ 29 марта 2019

Я настраиваю аутентификацию RESTful Web API, созданного на C # в .NET Core.Моя команда использует Entity Framework для взаимодействия с нашей базой данных PostgreSQL.Пароли пользователей, которые мы сохраняем в базе данных, хешируются с помощью SHA256.Когда клиент / пользователь пытается аутентифицироваться в нашем API, мы расшифровываем его пароль с помощью нашего общего ключа, затем хешируем его с помощью SHA256 и сравниваем результат с хешированным паролем, который мы имеем в базе данных.Сейчас я тестирую код с примером пользователя, и его хешированный пароль вышел (и был сохранен в базе данных) следующим образом:? -E> $? N \ u 000f ?? tw: $???? \ и 0017et ?? |? J K ??? S?.Обратите внимание на два "\ u".К сожалению, похоже, что Entity Framework интерпретирует их как escape-коды и при получении объекта User (со свойством Password) автоматически добавляет еще один \ , превращая \ u в \\ и .

На следующем рисунке верхняя половина показывает хешированный пароль при его сохранении в базе данных, а нижняя показывает, как Entity изменяет его, как я объяснил.

Entity escaping strings automatically

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

Попыткаманипулирование строкой не обсуждается: это хешированный пароль, поэтому нет никакого реального шаблона для подражания, и я не могу предвидеть, как Entity будет интерпретировать и изменять \ и экранирующие символы или подстроки в целом.

Мой обходной путь использует Regex.Unescape () , но поскольку сама Microsoft говорит, что она не может быть на 100% точной, мне это не нравится.
В этом коде пароль - это строка, которую я получаю из запроса.Я хэширую его с помощью SHA256 и назначаю ему hashedPassword .При запросе к базе данных я запрашиваю пользователя ( Client ), чье имя пользователя и пароль соответствуют username , которое я получил из запроса, и hashedPassword .Без Regex.Unescape () строка, полученная Entity Framework, не совпадает с hashedPassword (хотя, как я объяснил, на самом деле это относится к базе данных).

else
{
    using (SHA256Managed shaHasher = new SHA256Managed())
    {
        byte[] hashResult = shaHasher.ComputeHash(Encoding.ASCII.GetBytes(password));
        hashedPassword = Encoding.ASCII.GetString(hashResult);
    }
}

using (MasterDataContext context = new MasterDataContext())
{
    try
    {
        user = await Task.Run<Client>(() =>
                    context.Client
                           .SingleOrDefault<Client>(
                                c => c.UserName.Equals(username)
                                    && Regex.Unescape(c.Password).Equals(hashedPassword)));
    }
}

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

1 Ответ

2 голосов
/ 29 марта 2019

Обычно я не люблю размещать фотографии как часть вопроса / ответа, но в этом случае это стоит 1000 слов.Короче говоря, вы видите только то, как VS отображает обратную косую черту.Это избегает этого в показе, но фактически не изменяет это.Как вы можете видеть на моем скриншоте, у меня есть текстовый файл, который полон escape-символов.VS добавляет дополнительные косые черты, но когда я пишу в консоль или записываю в файл, эти дополнительные косые черты не являются частью данных.

SnippetShowingAllStyles

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