Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование паролей ASP NET MVC, Хэширование паролей в таблице ASP NETMVC 
:(
    Опции темы
Maxim1914
Дата 23.6.2015, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.6.2015

Репутация: нет
Всего: нет



Доброго времени суток всем. У меня задание - создать таблицу с базой данных пользователей. Там есть графа: пароли. И при редактировании таблица или добавлении в него нового элемента, нужно, чтобы пароль шифровался (соление). Помогите реализовать эту задачу, сам уже две недели не могу сделать это. ASP net начал изучать месяц назад, а сроки выполнения задачи поджимают. 
У меня есть модель Table.cs, контроллер HomeController.cs, AdminController.cs, в AdminController у меня вывод, добавление, создание и удаление элементов. В Table.cs есть переменная пароля public string password { get; set; }. 
В общем нужно, чтобы когда клиент добавлял новый пароль, пароль хэшировался и этот хэш можно было где то хранить и отображать в отдельном представлении
PM MAIL   Вверх
Cheloveck
Дата 23.6.2015, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Тут смотрел?


--------------------
user posted image
PM Jabber   Вверх
Maxim1914
Дата 23.6.2015, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.6.2015

Репутация: нет
Всего: нет



Смотрел, не умею реализовывать. Вот код того, что написал, не знаю, что делать дальше:
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);
        }
    }
}

PM MAIL   Вверх
Cheloveck
Дата 23.6.2015, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(Maxim1914 @  23.6.2015,  14:09 Найти цитируемый пост)
Смотрел, не умею реализовывать. 

Мне кажется, ты не умеешь читать. http://web.securityinnovation.com/appsec-w...ords-in-ASP-NET

В базе пароль хранить нельзя! В базе хранишь только хеш и соль. Когда надо аутенифицировать пользователя, выбераешь его по username или e-mail, снимаешь хеш с того пароля, который передал тебе пользователь с солью из базы и если новый хеш равен тому, что лежит в базе, то пользователь аутенифицирован.



Это сообщение отредактировал(а) Cheloveck - 23.6.2015, 14:29


--------------------
user posted image
PM Jabber   Вверх
Maxim1914
Дата 25.6.2015, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.6.2015

Репутация: нет
Всего: нет



Мне не нужна аутентификация, нужно просто хранить хэш и все. В контроллере прописал: 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://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.