Генерация пароля на основе строки в C # - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы генерировать (защищать) пароли локальных администраторов на основе имен компьютеров в нашей организации. Таким образом, я могу создать небольшой пользовательский интерфейс, который принимает имя компьютера и пароль. В PowerShell мы будем использовать одну и ту же DLL для генерации пароля и установки его на каждой рабочей станции.

Я уже искал, но все, что я нашел в криптографии в C #, это хэширование пароля, но мне нужен сам хэш, чтобы быть паролем.

Пароль также должен иметь длину от 8 до 12 символов, чтобы его было достаточно легко ввести.

Я использую .NET Core 2.0 (при необходимости можно использовать .NET Framework)

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

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

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

Если вы идете по пути мастер-пароля, вам нужен план, как справиться с подозрением на утечку. (Включая кого-то, кто знал, что он покидает организацию, поскольку это утечка.)

Пример соломника, который включает:

  • Использование даты
  • Использование мастер-пароля
  • Использование HMAC для обработки имени машины, введенного ключом из мастер-пароля
  • Счетчик итераций для PBKDF2, который соответствует современным компьютерам.

.

private static string GeneratePassword(
    string masterPassword,
    string machineName,
    DateTimeOffset lastChangeDate)
{
    // Use the date (ignoring time) of the last password change as a salt.
    byte[] salt = BitConverter.GetBytes(lastChangeDate.ToUniversalTime().Date.Ticks);

    HashAlgorithmName prf = HashAlgorithmName.SHA256;

    using (var pbkdf2 = new Rfc2898DeriveBytes(masterPassword, salt, 123456, prf))
    {
        byte[] key = pbkdf2.GetBytes(256 / 8);

        using (HMAC hmac = new HMACSHA256(key))
        {
            byte[] value = hmac.ComputeHash(
                Encoding.UTF8.GetBytes(machineName.ToUpperInvariant()));

            // Or however long.
            return Convert.ToBase64String(value).Substring(0, 16);
        }
    }
}

Перегрузка конструктора Rfc2898DeriveBytes, которая принимает HashAlgorithmName для PBKDF2-PRF, является новой в netcoreapp20. Если вы пытаетесь быть netstandard20, вы можете удалить последний параметр и использовать версию на основе SHA-1 с минимальным вредом (поскольку HMACSHA-1 в настоящее время не считается сломанной).

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


Другой альтернативой является генерация случайных паролей и сохранение их в зашифрованном структурированном файле. Что-то вроде EnvelopedCms, так как контейнер шифрования предоставляет вам смарт-карту практически бесплатно и позволяет добавлять / удалять считыватели без изменения всех паролей компьютера (добавление легко, удаление может в любом случае оправдать их изменение).

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

0 голосов
/ 14 мая 2018

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

В любом случае, вы можете хэшировать имя компьютера и использовать результат в качестве пароля. Большинство, если не все хеши, дают больше хешей, чем 8-12 символов «достаточно легко вводить», но вы можете решить это следующим образом:

  • Base64, кодирующий хэш (для получения букв, цифр и пары других символов)
  • Возьмите желаемое количество символов из результата.

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

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

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