Подтвердить что ты не робот

Используйте соль при использовании SimpleMembershipProvider

Возможный дубликат:
WebMatrix WebSecurity PasswordSalt

Есть ли способ, чтобы simpleMembershipProvider использовал соль?

когда я создаю свой веб-проект mvc4 и устанавливаю соединение по умолчанию с sqlexpress, затем регистрируюсь, мои пользователи не имеют соли для пароля

enter image description here

Я бы хотел, чтобы это было так же безопасно, как без особых проблем.

4b9b3361

Ответ 1

Столбец PasswordSalt не используется, но соление используется при создании хешированного пароля, который хранится в поле Пароль. Вы можете увидеть это, если посмотрите исходный код для SimpleMembershipProvider: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/3a669e7112e7#src%2fWebMatrix.WebData%2fSimpleMembershipProvider.cs

Проверьте метод CreateUserAndAccount. Он использует метод Crypto.HashPassword:

    /* =======================
     * HASHED PASSWORD FORMATS
     * =======================
     * 
     * Version 0:
     * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations.
     * (See also: SDL crypto guidelines v5.1, Part III)
     * Format: { 0x00, salt, subkey }
     */

    public static string HashPassword(string password)
    {
        if (password == null)
        {
            throw new ArgumentNullException("password");
        }

        // Produce a version 0 (see comment above) password hash.
        byte[] salt;
        byte[] subkey;
        using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount))
        {
            salt = deriveBytes.Salt;
            subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
        }

        byte[] outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength];
        Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize);
        Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength);
        return Convert.ToBase64String(outputBytes);
    }

В основном для решения ваших проблем это безопасно, как и должно быть, если вы не столкнетесь с какой-либо дополнительной проблемой.

Ответ 2

Цитата из документации:

По дизайну класс SimpleMembershipProvider не реализует полный набор функций, который возможен в членстве ASP.NET провайдеров, как определено в классе MembershipProvider, который используется всех поставщиков членства в ASP.NET. Некоторые члены доступны в потому что они унаследованы от базового класса, но будут бросать исключение, если вы обращаетесь к ним.

Если ваш веб-сайт требует наличия возможностей полного членства, вы можете пропустить инициализацию системы членства в веб-страницах (которая, не вызывайте WebSecurity.InitializeDatabaseConnection()) и вместо этого убедитесь, что стандартные поставщики членства и роли включен. В этом случае вызовы, которые вы Класс SimpleMembershipProvider передается стандарту провайдера (который упоминается как предыдущий поставщик в Документация класса SimpleMembershipProvider). Чтобы получить больше информации, см. настройка приложения ASP.NET для использования членства.

Поле PasswordSalt является одним из этих столбцов. Если вы посмотрите на исходный код SimpleMembershipProvider, вы заметите, что столбец PasswordSalt просто установлен на string.Empty:

if (database.Execute("INSERT INTO [" + MembershipTableName + "] (UserId, [Password], PasswordSalt, IsConfirmed, ConfirmationToken, CreateDate, PasswordChangedDate, PasswordFailuresSinceLastSuccess) VALUES (@0, @1, @2, @3, @4, @5, @5, @6)", new object[] { num, str, string.Empty, !requireConfirmationToken, obj3, DateTime.UtcNow, num2 }) != 1)
{
    throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
}

Итак, если вы хотите использовать его, вы можете написать собственный поставщик членства, который переопределяет значение по умолчанию и самостоятельно генерирует PasswordSalt. Вы можете переопределить метод CreateAccount.