Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .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
Цитата(Maxim1914 @  23.6.2015,  14:09 Найти цитируемый пост)
Смотрел, не умею реализовывать. 

Мне кажется, ты не умеешь читать. 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)