Задать вопрос

Какой простой и надежный способ хэширования пароля ASP.NET MVC?

Нужен простой и надежный способ хэширования пароля в контроллере AccountCOntroller
Выглядит он так:
public class AccountController : Controller {

        private IAuthProvider authProvider;
        private IUserRepository repository;

        public AccountController(IAuthProvider auth, IUserRepository repo) {
            authProvider = auth;
            repository = repo;
        }

        public ViewResult Login() {
            return View();
        }

        public ViewResult Register() {
            return View();
        }

        [HttpPost]
        public ActionResult Login(LoginViewModel model) {

            if (ModelState.IsValid) {

                User user = repository.Users().FirstOrDefault(m => m.Login == model.Login && m.Password == model.Password);
                if(user != null) {
                    authProvider.Authenticate(model.Login);
                    return RedirectToAction("Index", "Document");
                } else {
                    ModelState.AddModelError("", "Неверный логин или пароль");
                }
   
            }
            return View(model);
        }

        [HttpPost]
        public ActionResult Register(RegisterViewModel model) {

            

            if (ModelState.IsValid) {

                User user = repository.Users().FirstOrDefault(m => m.Login == model.Login);
                if (user == null) {
                    repository.Add(new User { Login = model.Login, Password = model.Password });

                    user = repository.Users().Where(m => m.Login == model.Login && m.Password == model.Password).FirstOrDefault();
                    if (user != null) {
                        authProvider.Authenticate(model.Login);
                        return RedirectToAction("Index", "Document");
                    }

                } else {
                    ModelState.AddModelError("", "Пользователь с таким логинм уже есть");
                }
               
            }

            return View(model);
        }

        public ActionResult ExitToStore() {
            authProvider.Exit();
            return RedirectToAction("Login");
        }

    }
  • Вопрос задан
  • 1555 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 3
lexxpavlov
@lexxpavlov
Программист, преподаватель
Для хеширования пароля лучше всего использовать BCrypt (пример).
Если не нравится BCrypt, то можно использовать SHA512 - он уже есть в .NET Framework.
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
Касательно архитектуры - тащить репозиторий до уровня контроллера это уровень второй четверти первого класса.
В идеале у вас должен быть уровень bl который проверит пользователя, выдаст ему сессионную куку или еще какой признак авторизации и вернет результат своей работы. В случае успеха - перенаправить куда-нибудь.
Касательно хеширования - SHA512 и какой-нибудь алгоритм засолки повеселее(не надо просто лепить соль сбоку).
Касательно уровня, на котором будет считаться хеш - все зависит от алгоритма авторизации. В вашем случае пахнуло EF и видимо стоит считать хэш на уровне обращения к репозиторию.
Если будете использовать хранимки - придется тащить пароль не трогая до самой бд и считать хеш там. Иначе появится логика извлечения всей базы пользователей с последующим поиском нужного, который не факт что найдется
Ответ написан
@LootKeeper
Почему бы не использовать стандартный класс .net : MD5?

Использовать очень просто:

using System;
    using System.Text;
    using System.Security.Cryptography;
    class Program
    {

        static void Main(string[] args)
        {
            string pass = "123";

            using(MD5 md5 = MD5.Create())
            {
                string hash = GetMD5(md5, pass);

                Console.Write(hash);

                Console.ReadKey();
            }
        }

        static string GetMD5(MD5 md5, string pass)
        {
            byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(pass));

            StringBuilder sb = new StringBuilder();

            for(int i =0; i<data.Length; i++)
            {
                sb.Append(data[i].ToString("x2"));
            }

            return sb.ToString();
        }
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы