| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Шифрование паролей ASP NET MVC |
| Автор: Maxim1914 23.6.2015, 04:57 |
| Доброго времени суток всем. У меня задание - создать таблицу с базой данных пользователей. Там есть графа: пароли. И при редактировании таблица или добавлении в него нового элемента, нужно, чтобы пароль шифровался (соление). Помогите реализовать эту задачу, сам уже две недели не могу сделать это. ASP net начал изучать месяц назад, а сроки выполнения задачи поджимают. У меня есть модель Table.cs, контроллер HomeController.cs, AdminController.cs, в AdminController у меня вывод, добавление, создание и удаление элементов. В Table.cs есть переменная пароля public string password { get; set; }. В общем нужно, чтобы когда клиент добавлял новый пароль, пароль хэшировался и этот хэш можно было где то хранить и отображать в отдельном представлении |
| Автор: Cheloveck 23.6.2015, 10:54 |
| https://www.google.com/search?newwindow=1&site=&source=hp&q=asp.net+salt+encryption&oq=.net+solt+encry&gs_l=hp.3.1.0i22i30j0i13i5i30j0i8i13i30l2.2119.17190.0.26909.26.21.4.1.1.0.242.3436.0j3j13.16.0....0...1c.1.64.hp..9.17.2651.0.OSFDMT74ocg смотрел? |
| Автор: Maxim1914 23.6.2015, 13:09 |
| Смотрел, не умею реализовывать. Вот код того, что написал, не знаю, что делать дальше: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using WebApplication11.Models; using System.Security.Cryptography; using System.Web.Security; using System.Text; namespace WebApplication11.Models { /// <summary> /// Salted password hashing with PBKDF2-SHA1. /// Author: havoc AT defuse.ca /// www: http://crackstation.net/hashing-security.htm /// Compatibility: .NET 3.0 and later. /// </summary> public class PasswordHash { public string PasswordHashCode(string passwordhash) { using (var context = new Database1Entities()) { var user = from u in context.Tables where u.Password == passwordhash select u.Password; string password = CreateHash(passwordhash); return (password); } } // The following constants may be changed without breaking existing hashes. public const int SALT_BYTE_SIZE = 24; public const int HASH_BYTE_SIZE = 24; public const int PBKDF2_ITERATIONS = 1000; public const int ITERATION_INDEX = 0; public const int SALT_INDEX = 1; public const int PBKDF2_INDEX = 2; public static string CreateHash(string password) { // Generate a random salt RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider(); byte[] salt = new byte[SALT_BYTE_SIZE]; csprng.GetBytes(salt); // Hash the password and encode the parameters byte[] hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); return PBKDF2_ITERATIONS + ":" + Convert.ToBase64String(salt) + ":" + Convert.ToBase64String(hash); } private static bool SlowEquals(byte[] a, byte[] b) { uint diff = (uint)a.Length ^ (uint)b.Length; for (int i = 0; i < a.Length && i < b.Length; i++) diff |= (uint)(a[i] ^ b[i]); return diff == 0; } /// <summary> /// Computes the PBKDF2-SHA1 hash of a password. /// </summary> /// <param name="password">The password to hash.</param> /// <param name="salt">The salt.</param> /// <param name="iterations">The PBKDF2 iteration count.</param> /// <param name="outputBytes">The length of the hash to generate, in bytes.</param> /// <returns>A hash of the password.</returns> private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes) { Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt); pbkdf2.IterationCount = iterations; return pbkdf2.GetBytes(outputBytes); } } } |
| Автор: Cheloveck 23.6.2015, 14:29 |
Мне кажется, ты не умеешь читать. http://web.securityinnovation.com/appsec-weekly/blog/bid/58887/How-to-Hash-and-Salt-Passwords-in-ASP-NET В базе пароль хранить нельзя! В базе хранишь только хеш и соль. Когда надо аутенифицировать пользователя, выбераешь его по username или e-mail, снимаешь хеш с того пароля, который передал тебе пользователь с солью из базы и если новый хеш равен тому, что лежит в базе, то пользователь аутенифицирован. |
| Автор: Maxim1914 25.6.2015, 08:37 |
| Мне не нужна аутентификация, нужно просто хранить хэш и все. В контроллере прописал: public ActionResult Edit(int id, [Bind(Include = "ID,Name,Surname,Father_name,Mobile_phone_number,Address,Email,Login,Password,Salt")] Table table) { /*var u = db.Tables.Single(x => x.ID == table.ID); if (TryUpdateModel(u)) { u.Salt = PasswordHash.CreateHash(table.Password); db.SaveChanges(); return RedirectToAction("Index"); } */ var usersEdit = (from user in db.Tables where user.ID == id select user).First(); if (ModelState.IsValid) { usersEdit.Password = PasswordHash.CreateHash(table.Password); //usersEdit.Password = PasswordHash.CreateHash(usersEdit.Password); //UpdateModel(usersEdit); //db.Entry(table).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(usersEdit); Только он все правильно делает, то есть хэширует, но потом выдает ошибку. А если добавить вот это: //UpdateModel(usersEdit); то все пашет, но обратно возвращает исходный пароль без хэша. Что и как делать дальше??? Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Shifrovaniye-paroley-ASP-NET-MVC-id5588bdacae2015750f8b4567#findElement_E7045_558b9396ae20152f12baa0ec_0 |