Хеш и соленые пароли в C#

Я просто проходил одну из статей DavidHayden о Хешировании Паролей пользователя.

Действительно я не могу получить то, чего он пытается достигнуть.

Вот его код:

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);
    string hashedPwd =
        FormsAuthentication.HashPasswordForStoringInConfigFile(
        saltAndPwd, "sha1");
    return hashedPwd;
}

Есть ли какой-либо другой метод C# для хеширования паролей и добавления соли к нему?

174
задан DuckMaestro 24 July 2014 в 21:37
поделиться

2 ответа

На самом деле это странно, со строковыми преобразованиями, которые провайдер членства делает их в в конфигурацию файлов. Хэши и соли - бинарные капли, вам не нужно преобразовывать их в строки, если вы не хотите поместить их в текстовые файлы.

В моей книге Начиная о безопасности ASP.NET , (о, в конце концов, оправдание для проката за книгу) Я делаю следующее

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
  HashAlgorithm algorithm = new SHA256Managed();

  byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length];

  for (int i = 0; i < plainText.Length; i++)
  {
    plainTextWithSaltBytes[i] = plainText[i];
  }
  for (int i = 0; i < salt.Length; i++)
  {
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
  }

  return algorithm.ComputeHash(plainTextWithSaltBytes);            
}

Соль Сольюмера является в качестве примера в вопросе. Вы можете преобразовать текст в байтовые матрицы, используя encoding.utf8.getbytes (строка) . Если вы должны преобразовать хэш в его строковое представление, вы можете использовать Convertry.tobase64string и Convert.frombase64string , чтобы преобразовать его обратно.

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

public static bool CompareByteArrays(byte[] array1, byte[] array2)
{
  if (array1.Length != array2.Length)
  {
    return false;
  }

  for (int i = 0; i < array1.Length; i++)
  {
    if (array1[i] != array2[i])
    {
      return false;
    }
  }

  return true;
}

всегда , используйте новую соль на пароль. Соли не должны храниться в секрете и могут храниться рядом с самой хаш.

240
ответ дан 23 November 2019 в 20:31
поделиться

Соль используется для добавления дополнительного уровня сложности в хэш, чтобы затруднить грубую рубрику.

Из статьи на месте на месте :

Хакер все еще может выполнить Что называется атакой словаря. Вредоносные вечеринки могут сделать Словарь атака, принимая, для экземпляр, 100 000 паролей, которые они знают, что люди часто используют (например, город имена, спортивные команды и т. Д.), Хеш их, а затем сравнить каждую запись в Словарь против каждой строки в Таблица базы данных. Если хакеры находят Матч, Бинго! У них есть ваш пароль. Однако решить эту проблему, мы Нужно только солью хеш.

Чтобы солить хэш, мы просто придумали Случайная строка текста, объединить его с паролем поставляется пользователем, то хэш оба случайно сгенерированная строка и пароль вместе как одно значение. Мы затем сохраните оба хеша, так и соль как отдельные поля внутри пользователей стол.

в этом сценарии не только бы Хакер должен угадать пароль, Они должны догадаться до соли. Добавление соли в чистый текст улучшается Безопасность: сейчас, если хакер пытается Словарь атака, он должен быть его его 100 000 записей с солью каждого Пользовательская строка. Хотя это все еще возможно, шансы взлома Успех уменьшается радикально.

Нет метода автоматически выполнения этого в .NET, поэтому вы пойдете с решением выше.

24
ответ дан 23 November 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: