Хэширование пароля Identity Asp.net

В новом проекте ASP.net Identity появился полезный код и интерфейсы для обеспечения безопасности веб-сайта. Для реализации пользовательской системы с использованием интерфейсов (вместо использования стандартной реализации Entity Framework, включенной в шаблон MVC 5) требуется IPasswordHasher.

IPasswordHasher интерфейс в идентификаторе ASP.net

namespace Microsoft.AspNet.Identity
{
    public interface IPasswordHasher
    {
         string HashPassword(string password);
         PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword);
    }
}

Можно ли использовать пароль для более безопасного шифрования в ASP.net Identity и через этот интерфейс?

Ответ 1

"Возможно ли использовать всплывающее окно для более безопасного шифрования в ASP.net Identity и через этот интерфейс?"

Да, интерфейс предоставлен для новой реализации PasswordHasher, уже присутствующей в основной структуре.

Также обратите внимание, что реализация по умолчанию уже использует Salt + Bytes.

После создания пользовательского PasswordHasher (скажем MyPasswordHasher) его можно присвоить экземпляру UserManager, например userManager.PasswordHasher=new MyPasswordHasher()

См. один пример такого IPasswordHasher

Для реализации пользовательской системы с использованием интерфейсов (вместо использования стандартной реализации Entity Framework, включенной в шаблон MVC 5) требуется IPasswordHasher.

Для реализации альтернативной системы из EF, - Вы должны реализовать все интерфейсы Core. - Реализация IPasswordHasher не требуется. PasswordHasher уже представлен в основной структуре как реализация.

Ответ 2

ПРЕДУПРЕЖДЕНИЕ ЗДОРОВЬЯ для ответа ниже: узнайте, какую версию ASP.Net Identity вы используете. Вы должны напрямую ссылаться на исходный код, если это одна из новых версий из репозитория github.

Как я пишу это, текущая версия (3.0.0-rc1/.../PasswordHasher.cs) обработчика пароля существенно отличается от приведенного ниже ответа. Эта новая версия поддерживает несколько версий алгоритма хэша и документируется как (и может измениться к тому моменту, когда вы это прочитали):

Версия 2:

  • PBKDF2 с HMAC-SHA1, 128-битной солью, 256-битным подразделением, 1000 итерациями.
  • (См. также: Руководство по криптографии SDL v5.1, часть III).
  • Формат: { 0x00, salt, subkey }

Версия 3:

  • PBKDF2 с HMAC-SHA256, 128-битной солью, 256-битным подразделением, 10000 итераций.
  • Формат: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey }
  • (Все UInt32 хранятся в формате big-endian.)

Оригинальный ответ по-прежнему действителен для исходной версии ASP.Net Identity и выглядит следующим образом:


@jd4u правильно, но пролить немного больше света, который не вписывался бы в комментарий для его ответа:

Итак, если вы собираетесь использовать Rfc2898DeriveBytes, просто используйте PasswordHasher - весь тяжелый подъем уже сделан (надеюсь, правильно) для вас.

Подробнее

Полный код, который в конечном счете использует PasswordHasher (в настоящее время), очень близок к:

int saltSize = 16;
int bytesRequired = 32;
byte[] array = new byte[1 + saltSize + bytesRequired];
int iterations = SOME; // 1000, afaik, which is the min recommended for Rfc2898DeriveBytes
using (var pbkdf2 = new Rfc2898DeriveBytes(password, saltSize, iterations))
{
    byte[] salt = pbkdf2.Salt;        
    Buffer.BlockCopy(salt, 0, array, 1, saltSize);
    byte[] bytes = pbkdf2.GetBytes(bytesRequired);
    Buffer.BlockCopy(bytes, 0, array, saltSize+1, bytesRequired);
}
return Convert.ToBase64String(array);

Ответ 3

У меня возникла проблема при обновлении с членства в AspNet.Identity. Хеши Rfc2898 отличаются от тех, которые использовались ранее. Это по уважительной причине, но изменение хэшей потребует от всех пользователей reset их паролей. В качестве решения эта пользовательская реализация делает ее обратной совместимостью:

public class MyPasswordHasher : PasswordHasher {

   public FormsAuthPasswordFormat FormsAuthPasswordFormat { get; set; }

   public MyPasswordHasher(FormsAuthPasswordFormat format) {
      FormsAuthPasswordFormat = format;
   }

   public override string HashPassword(string password) {
      return FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.ToString());
   }

   public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) {
     var testHash = FormsAuthentication.HashPasswordForStoringInConfigFile(providedPassword, FormsAuthPasswordFormat.ToString());
     return hashedPassword.Equals(testHash) ? PasswordVerificationResult.Success : PasswordVerificationResult.Failed;
   }
}

После создания экземпляра UserManager просто установите хешер:

Usermanager.PasswordHasher = new MyPasswordHasher(FormsAuthPasswordFormat.SHA1);

Код жалуется, что метод HashPasswordForStoringInConfigFile устарел, но это прекрасно, поскольку мы знаем, что все упражнение состоит в том, чтобы избавиться от старой технологии.