Статьи

Криптографический генератор случайных паролей

  1. Вебинар: По запросу, по требованию Настольный компьютер как услуга, разработанный для любого облака?...
  2. Эта проблема
  3. Решение
  4. Заключение
  5. Обновление (01.06.08)

Вебинар:
По запросу, по требованию

Настольный компьютер как услуга, разработанный для любого облака? Рамка Нутаникс


Вступление

Создать пароль легко. Однако создать надежный пароль нелегко. Большинство паролей являются простыми вариантами словарных слов, часто со случайными числами в конце или просто заменами (1 для Is, символ «@» для As и т. Д.). Проблема этой схемы в том, что ее легко угадать с помощью сложного программного обеспечения для подбора паролей. Такое программное обеспечение, например, что Доступ к данным , может взломать открытые пароли, которые следуют таким упрощенным шаблонам, даже если эти пароли содержат несколько преднамеренно неправильно написанных слов, случайных чисел и других общих шаблонов

Эта проблема

Проблема с паролями в том, что они не случайны. Они основаны на предсказуемых моделях. Их легко запомнить и, следовательно, легко взломать. Некоторые пароли не должны быть сложными. Сложность пароля должна соответствовать a) возможным векторам атаки и b) значению данных или ресурса, защищенного этим паролем. Например, контакты банкомата являются 4-значными. Но они достаточно безопасны, потому что они не подвергаются атакам грубой силы.

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

Решение

Используйте криптографически случайный пароль в тех случаях, когда безопасность необходима. Криптографический генератор случайных паролей предоставляет такую ​​услугу. Как это работает? Первый шаг - получить криптографически случайное 32-разрядное целое число. В пространстве имен System (которое вы будете использовать) Microsoft предоставляет класс Random, но уровень энтропии (случайности) минимален, если вы полагаетесь только на этот класс. Вместо этого вы будете использовать пространство имен RNGCryptoServiceProvider, предоставленное в System.Security.Cryptography:

byte [] randomBytes = новый байт [4]; RNGCryptoServiceProvider rng = новый RNGCryptoServiceProvider (); rng.GetBytes (RANDOMBYTES); Int32 randomInt = BitConverter.ToInt32 (randomBytes, 0); вернуть randomInt;

Хорошо; Теперь у вас есть 32-разрядное целое число, которое является абсолютно случайным. Вы можете безопасно использовать это криптографически случайное целое число в качестве начального числа в классе Random. Фактически вы будете генерировать новое случайное начальное число для каждой итерации (для каждого символа пароля). Зачем? Потому что, если вы используете случайное значение в качестве начального начального числа, энтропия пароля все еще не криптографически случайна. Вы сгенерировали случайное начальное число, но с учетом этого начального числа сгенерированные значения класса Random все еще довольно предсказуемы. Следовательно, вы генерируете новое семя каждый раз, когда вам нужен персонаж, и Random использует это случайное семя.

Итак, зачем вам Random, если у вас есть класс RNGCryptoServiceProvider? Ответ в том, что вам нужно отобразить случайно сгенерированное значение в массив. Массив будет содержать набор символов - список допустимых символов в нашем пароле. По умолчанию этот список будет содержать буквы az, AZ, 0-9, а также некоторые специальные символы (десять из них). Следовательно, список включает в себя в общей сложности 72 различных символа. Основной цикл итерации, заполняющий последнюю строку пароля, выглядит примерно так:

for (int i = 0; i <len; i ++) {// Получаем наше криптографически случайное 32-разрядное целое число и используем его // как начальное число в классе Random // ПРИМЕЧАНИЕ: случайное значение генерируется PER ITERATION, что означает / / что класс System.Random обновляется каждую // итерацию с новым, криптографически случайным числовым начальным числом. int randInt32 = RandomInt32Value.GetRandomInt (); Случайный r = новый Случайный (randInt32); int nextInt = r.Next (ableChars.Length); char c = возможныхChars [nextInt]; builder.Append (с); }

Вызов статического метода к RandomInt32Value выполняет задачу получения случайного 32-разрядного целого числа, поскольку этот класс инкапсулирует необходимые вызовы класса RNGCryptoServiceProvider. Для удобства предоставляемое приложение включает в себя возможность установки длины пароля и набора возможных символов, как показано на снимке экрана ниже:

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

Наконец, обратите внимание, что приложение предоставляет возможность просмотра статистического распределения частот сгенерированного пароля. Зачем вам это нужно? Для тестирования вы можете сгенерировать пароль в 10 000 символов, используя доступные символы (или, для простоты, только определенные символы, например 0-9). Теория предполагает, что, грубо говоря, сгенерированные персонажи будут иметь равные шансы быть выбранными в финальной ключевой фразе. Например, я сгенерировал парольную фразу из 10000 символов, используя символы от 0 до 9. Выбранные значения были примерно одинаковыми по частоте (хороший признак случайности, что означает, что алгоритм случайности не показывает статистический фаворитизм).

Выбранные значения были примерно одинаковыми по частоте (хороший признак случайности, что означает, что алгоритм случайности не показывает статистический фаворитизм)

Заключение

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

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

Обновление (01.06.08)

Я исправил небольшую орфографическую ошибку в основной форме приложения.

Кроме того, источник теперь находится в решении Visual Studio 2008 вместо VS 2005.

Наконец, я подписал PGP исполняемый файл с моим ключом PGP (на корпоративном сервере PGP и на моем веб-сайте, www.gmgdesign.com ). Если вы предпочитаете, MD5-хэш исполняемого файла: f4f48c80c73f81aba128c580364d0279. Если вы столкнулись с несоответствием подписи / хэша, пожалуйста, www.gmgdesign.com

Вебинар: По запросу, по требованию Настольный компьютер как услуга, разработанный для любого облака?
Итак, когда вам нужно использовать нетривиальные, случайные пароли?
Как это работает?
Зачем?
Итак, зачем вам Random, если у вас есть класс RNGCryptoServiceProvider?
Зачем вам это нужно?
Или даже завтрашней?

Новости

Карта