Как хешировать пароли пользователей? - PullRequest
0 голосов
/ 14 февраля 2019

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

Asp.net MVC - Как хешировать пароль

Пароли Hash and Salt в C #

Я создаю веб-сайт, на котором есть страница входа, и я читаю этот пост

https://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right#normalhashing

о том, как сделать мой вход в систему безопасным.

Теперь я понимаю, что при каждой регистрации мне нужно создавать CSPRNG (криптографически безопасный генератор псевдослучайных чисел) и добавлять его к паролю, предоставленному пользователем, а затем хешэто смешать и сохранить его в БД, и сохранить соль для каждого пользователя, потому что это случайный для каждого пользователя.Мой вопрос заключается в том, что является самым простым и простым способом сделать это.

В моем контроллере я беру имя пользователя и пароль с помощью этого метода

public JsonResult Login(LoginModel data)
{  
   //some code...
   //...
}

Моя модель входа в систему содержит

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

, поэтому я получаю имя пользователя и пароль, такие как (строка a = data.Username, ...)

Я уже добавил это в свой проект, но я не знаюкак продолжить отсюда

using System.Security.Cryptography;

Я знаю, как сохранить в БД наверняка, я просто хочу знать, как сделать случайную соль (возможно, используя RNGCryptoServiceProvider), и как добавить ее в пользователяпароль, а затем хэшируйте окончательный результат.Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

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

    public static string EncodePassword(string password)
    {
        byte[] salt;
        byte[] buffer2;
        if (password == null)
        {
            throw new ArgumentNullException("password");
        }
        using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
        {
            salt = bytes.Salt;
            buffer2 = bytes.GetBytes(0x20);
        }
        byte[] dst = new byte[0x31];
        Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
        Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
        return Convert.ToBase64String(dst);
    }//Entity Framework default way 

В приведенном выше примере используются using System.Security.Cryptography; и system.Buffer

.
0 голосов
/ 15 февраля 2019

Я сделал так, и он работает нормально.

Я добавил новый класс

public class Helper
{

    public String CreateSalt(int size)
    {
        var rng = new RNGCryptoServiceProvider();
        var buff = new byte[size];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
    public String GenerateSha256Hash(string input, string salt)
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
        SHA256Managed shaString = new SHA256Managed();
        byte[] hash = shaString.ComputeHash(bytes);

        return BitConverter.ToString(hash);
    }

}

}

И в своем контроллере я добавил экземпляр этогоclass

Helper myHelper = new Helper();

Затем я передаю значения в

string salt = myHelper.CreateSalt(5);
string hashedPassword = myHelper.GenerateSha256Hash(*PasswordField*, salt);
hashedPassword = hashedPassword.Replace("-", string.Empty).Substring(0, 16);

Я удаляю «-» из хешированного пароля и затем беру первые 16 символов.

Спасибо @Luke Joshua Park, @ gusto2, @JamesS и @CodeCaster за помощь.

0 голосов
/ 14 февраля 2019

Ответ на каждый «Как мне безопасно хэшировать пароли» вопрос тот же: ВЫ НЕ .Вы занимаетесь созданием уникальных сайтов, а не бизнесом по обеспечению безопасности.Вы не знаете, что делаете, и не узнаете, если делаете что-то не так.До тех пор, пока ваша база данных так или иначе не просочится, и тогда вы уже слишком поздно что-либо предпринимаете, что ставит под угрозу безопасность ваших пользователей.

Вы используете хорошо проработанные, закаленные в боях, поддерживаемые код для хранения пользовательских логинов.Когда вы работаете в ASP.NET MVC, вы используете ASP.NET Identity .Вы НЕ катите свои собственные.Период.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...