Я настраиваю аутентификацию 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](https://i.stack.imgur.com/FMF5j.png)
Пароль, полученный из запроса после хеширования кодом, совпадает с паролем в базе данных, как показано здесь: Хешированный пароль
Попыткаманипулирование строкой не обсуждается: это хешированный пароль, поэтому нет никакого реального шаблона для подражания, и я не могу предвидеть, как 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)));
}
}
Это довольно плохо, я просто хочу просто вывести мою строку из базы данных в том виде, в каком она есть, без намеренного изменения ее сущностью, но я не знаю, что делать.