Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Хотя в Интернете можно найти множество примеров программ-генераторов «случайных» паролей, генерация случайности может быть сложной задачей, и многие программы не генерируют случайные символы таким образом, чтобы обеспечить надежную защиту. Распространенной рекомендацией является использование инструментов безопасности с открытым исходным кодом, где это возможно, поскольку они позволяют проводить независимые проверки качества используемых методов. Обратите внимание, что простая генерация пароля наугад не гарантирует, что пароль является надежным, потому что возможно, хотя и маловероятно, сгенерировать легко угадываемый или взломанный пароль. Фактически, нет никакой необходимости в том, чтобы пароль был произведен совершенно случайным процессом: просто нужно, чтобы его было достаточно сложно угадать.

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

Многим людям сложно запомнить длинные цепочки случайных символов. Мнемонические хэши, которые обратимо преобразуют случайные строки в более запоминающиеся пароли, могут существенно облегчить запоминание. Поскольку хеш-код может быть обработан компьютером для восстановления исходной 60-битной строки, он имеет, по крайней мере, столько же информационного содержания, сколько и исходная строка. [1] Подобные техники используются в спорте с запоминанием .

Наивный подход [ править ]

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

C [ править ]

# include <time.h> # include <stdio.h> # include <stdlib.h>int main ( void ) {  / * Длина пароля * /  unsigned  short  int  length  =  8 ; / * Номер начального числа для rand () * /  srand (( unsigned  int )  time ( 0 )); / * Символы ASCII с 33 по 126 * /  while  ( длина - )  {  putchar ( rand ()  %  94  +  33 );  } printf ( " \ п " ); вернуть  EXIT_SUCCESS ; }

В этом случае стандартная функция С рант , который представляет собой генератор псевдослучайных чисел , сначала высевали с использованием функции C время , но позже итераций используют рандов вместо этого. Согласно стандарту ANSI C, время возвращает значение типа time t , которое определяется реализацией, но чаще всего представляет собой 32-битное целое число, содержащее текущее количество секунд с 1 января 1970 года ( см. Unix time ). В году около 31 миллиона секунд, поэтому злоумышленник, который знает год (простой вопрос в ситуациях, когда политика паролей требует частой смены пароля ) и идентификатор процессачто пароль был сгенерирован, сталкивается с относительно небольшим количеством вариантов проверки по криптографическим стандартам. Если злоумышленник более точно знает, когда был сгенерирован пароль, он сталкивается с еще меньшим количеством кандидатов для тестирования - серьезный недостаток в этой реализации.

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

Функция rand представляет другую проблему. Все генераторы псевдослучайных чисел имеют внутреннюю память или состояние. Размер этого состояния определяет максимальное количество различных значений, которые оно может создать: n- битное состояние может создавать не более разных значений. Во многих системах rand имеет 31- или 32-битное состояние, что уже является значительным ограничением безопасности. Документация Microsoft не описывает внутреннее состояние реализации стандартной библиотеки C rand в Visual C ++ , но имеет только 32767 возможных выходов (15 бит) на вызов. [2] Microsoft рекомендует использовать другую, более безопасную функцию rand_s. По словам Microsoft, вывод rand_s криптографически безопасен и не использует семя, загруженное функцией srand. Однако его программный интерфейс отличается от rand. [3]

PHP [ править ]

функция  pass_gen ( int  $ length  =  8 ) :  строка {  $ pass  =  array ();  for  ( $ i  =  0 ;  $ i  <  $ length ;  $ i ++ )  {  $ pass []  =  chr ( mt_rand ( 32 ,  126 ));  } return  implode ( $ pass ); }

Во втором случае используется функция PHP microtime [4] , которая возвращает текущую временную метку Unix с микросекундами. Это увеличивает количество возможностей, но тот, кто хорошо знает, когда был сгенерирован пароль, например, дату начала работы сотрудника, по-прежнему имеет достаточно мало места для поиска. Кроме того, некоторые операционные системы не обеспечивают разрешение по времени до микросекунд, что резко сокращает количество вариантов выбора. Наконец, функция rand [5] обычно использует базовую функцию C rand и может иметь небольшое пространство состояний, в зависимости от того, как она реализована. Альтернативный генератор случайных чисел mt_rand, основанный на Mersenne Twisterгенератор псевдослучайных чисел, доступен в PHP, но также имеет 32-битное состояние. Есть предложения по добавлению сильной генерации случайных чисел в PHP. [6]

Более сильные методы [ править ]

Существует множество методов создания надежных, криптографически безопасных случайных паролей. На платформах Unix / dev / random и / dev / urandom обычно используются либо программно, либо в сочетании с такой программой, как makepasswd. [7] Программисты Windows могут использовать функцию Cryptographic Application Programming Interface, CryptGenRandom . Язык программирования Java включает класс SecureRandom . Другая возможность - получить случайность путем измерения некоторого внешнего явления, например, времени ввода с клавиатуры пользователя.

Во многих компьютерных системах уже есть приложение (обычно называемое «apg») для реализации FIPS 181. [8] FIPS 181 - автоматический генератор паролей - описывает стандартный процесс преобразования случайных битов (из аппаратного генератора случайных чисел) в несколько произносимые «слова». "подходит для ключевой фразы. [9] Однако в 1994 году была обнаружена атака на алгоритм FIPS 181, так что злоумышленник может ожидать, в среднем, взломать 1% учетных записей, имеющих пароли, основанные на алгоритме, после поиска всего 1,6 миллиона паролей. Это связано с неравномерным распределением сгенерированных паролей, что можно решить, используя более длинные пароли или изменив алгоритм. [10] [11]

Баш [ править ]

Вот пример кода, который использует / dev / urandom для генерации пароля с помощью простой функции Bash . Эта функция принимает длину пароля в качестве параметра или по умолчанию использует 16:

функция mkpw ()  {  LC_ALL = C tr -dc '[: graph:]' </ dev / urandom | голова -c $ { 1 : - 16 } ; эхо ;  }

Java [ править ]

Вот пример кода (адаптированный из класса PasswordGenerator [12] ), который использует SecureRandom для генерации пароля из 10 шестнадцатеричных символов:

String []  symbols  =  { "0" ,  "1" ,  "2" ,  "3" ,  "4" ,  "5" ,  "6" ,  "7" ,  "8" ,  "9" ,  "a" ,  «б» ,  «в» ,  «г» ,  «д» ,  «е» }; int  length  =  10 ; Случайный  случайный  =  SecureRandom . // начиная с JDK 8, это должно возвращать самый надежный алгоритм, доступный JVM StringBuilder  sb  =  new  StringBuilder ( length ); для  ( int  я  =  0 ;  я  <  длина ;  я ++ )  {  int  indexRandom  =  случайный . nextInt ( символы . длина );  сб . добавить ( символы [ indexRandom ] ); } Строковый  пароль =  сб . toString ();

TypeScript [ править ]

Пример использования модуля «crypto», встроенного в Node.js

импортировать  *  как  криптовалюту  из  "крипто" ;функция  генерировать ( длина  =  16 )  {  const  uppercase  =  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;  const  нижний регистр  =  "abcdefghijklmnopqrstuvwxyz" ;  константные  числа  =  "0123456789" ;  const  symbols  =  "! \" # $% & '() * +, -. / :; <=>? @ [\\] ^ _ `{|} ~" ;  const  all  =  прописные  +  строчные  +  числа  +  символы ;  let  password  =  "" ;  пусть  index  =  0 ;  индекс  <  длина ;  index ++ )  {  const  randomNumber  =  крипто . randomInt ( все . длина );  пароль  + =  все . charAt ( randomNumber );  }  вернуть  пароль ; }

JavaScript [ править ]

В этом примере используется Math.random (). Это код, часть руководства: [13]

функция  генерировать ( длина  =  12 )  {  var  uppercase  =  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;  var  lowercase  =  'abcdefghijklmnopqrstuvwxyz' ;  var  числа  =  '0123456789' ;  var  symbols  =  '! "# $% & \' () * +, -. / :; <=>? @ [\\] ^ _` {|} ~ ' ;  var  all  =  прописные  +  строчные  +  числа  +  символы ;  var  password  =  '' ;   index  =  0 ;  индекс  <  длина ;  index ++ )  {  var  character  =  Math . этаж ( Math . random ()  *  all . length );  пароль  + =  все . charAt ( персонаж );  }  вернуть  пароль ; }

Perl [ править ]

В этом примере используется модуль Crypt :: Random :: Source для поиска источника сильных случайных чисел (который зависит от платформы).

используйте  Crypt :: Random :: Source  qw (get_strong) ;в то время как ( длина ( $ out )  <  15 )  {  мой  $ a  =  get_strong ( 1 );  $ a  = ~  s / [^ [: graph:]] // g ;  $ out  . =  $ a ; } распечатать  $ out ;

Python [ править ]

Язык Python включает класс SystemRandom, который получает случайные биты криптографического уровня из / dev / urandom в Unix-подобной системе, включая Linux и macOS, тогда как в Windows он использует CryptGenRandom. [14] [15] Вот простой скрипт Python, демонстрирующий использование этого класса:

#! / usr / bin / env python3 import  random ,  string myrg  =  random . SystemRandom () длина  =  10 алфавит  =  строка . ascii_letters  +  строка . цифры пароль  =  str () . присоединиться ( myrg . выбор ( алфавит )  для  _  в  диапазоне ( длина )) печать ( пароль )

PHP [ править ]

Программа PHP может открываться и читать из / dev / urandom, если доступно, или вызывать утилиты Microsoft. [16] Третий вариант, если доступен OpenSSL, - это использовать функцию openssl_random_pseudo_bytes '.' [17]

Механические методы [ править ]

Еще один метод - использовать физические устройства, такие как игральные кости, для генерации случайности. Один простой способ сделать это - использовать таблицу символов 6 на 6. Первый бросок кубика выбирает строку в таблице, а второй - столбец. Так, например, выпадение 2, за которым следует выпадение 4, выберет букву «j» из приведенной ниже таблицы фракционирования . [18] Для генерации символов верхнего / нижнего регистра или некоторых символов можно использовать подбрасывание монеты: головы заглавными, решки - строчными. Если при броске игральных костей была выбрана цифра, то при подбрасывании орла можно выбрать символ над ней на стандартной клавиатуре, например «$» над «4» вместо «4».

Тип и надежность сгенерированного пароля [ править ]

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

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

где N - количество возможных символов, а L - количество символов в пароле. Функция log 2 - это логарифм по основанию 2 . H обычно измеряется в битах . [19] [20]

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

Обратите внимание, однако, что другой тип атаки может быть успешным против пароля, оцененного как «очень надежный» в соответствии с приведенным выше расчетом.

Программы-генераторы паролей и веб-сайты [ править ]

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

См. Также [ править ]

  • Криптографически безопасный генератор псевдослучайных чисел
  • Diceware
  • Аппаратный генератор случайных чисел
  • Размер ключа
  • Параметр длины пароля
  • Менеджер паролей

Ссылки [ править ]

  1. ^ Ghazvininejad, Марьян; Найт, Кевин (май – июнь 2015 г.). «Как запомнить случайную 60-битную строку» (PDF) . Материалы конференции 2015 г. Североамериканского отделения Ассоциации компьютерной лингвистики: технологии человеческого языка . Материалы конференции 2015 г. Североамериканского отделения Ассоциации компьютерной лингвистики: технологии человеческого языка. Денвер, Колорадо: Ассоциация компьютерной лингвистики. С. 1569–1575. DOI : 10.3115 / v1 / N15-1180 . S2CID  8028691 .
  2. ^ "RAND_MAX" . docs.microsoft.com .
  3. ^ «Устаревшая документация Visual Studio 2005» . Центр загрузки Майкрософт .
  4. ^ «PHP: microtime - Руководство» . php.net .
  5. ^ «PHP: rand - Руководство» . php.net .
  6. ^ "Архивная копия" . Архивировано из оригинала на 2008-10-19 . Проверено 17 октября 2008 .CS1 maint: заархивированная копия как заголовок ( ссылка )
  7. ^ "Linux / UNIX: Генерация случайного пароля с помощью mkpasswd / makepasswd / pwgen" . cyberciti.biz . Ноябрь 2007 г.
  8. ^ "StrongPasswords - Справочная вики сообщества" . help.ubuntu.com . Проверено 25 марта 2016 .
  9. ^ NIST. Автоматизированный генератор паролей стандарт FIPS 181
  10. ^ Шэй, Ричард; Келли, Патрик Гейдж; Командури, Саранга; Mazurek, Michelle L .; Ур, Блаз; Видас, Тимофей; Бауэр, Луджо; Кристин, Николас; Кранор, Лорри Фейт (2012). Правильный продукт для лошадиных аккумуляторов: изучение возможностей использования парольных фраз, назначаемых системой (PDF) . SOUPS '12 Труды восьмого симпозиума по полезной конфиденциальности и безопасности. DOI : 10.1145 / 2335356.2335366 .
  11. ^ Ганесан, Рави; Дэвис, Крис (1994). «Новая атака на генераторы произвольно произносимых паролей» (PDF) . Труды 17-й {NIST} - {NCSC} конференции по национальной компьютерной безопасности . NIST: 184–197 . Проверено 17 декабря 2014 .
  12. ^ "Оцените мой генератор случайных паролей!" . Крипто .
  13. ^ «Сгенерируйте безопасный пароль онлайн - RandomPasswordGenerator.org» . randompasswordgenerator.org .
  14. ^ «9.6. Random - Генерация псевдослучайных чисел - документация Python 3.5.1» . docs.python.org . Проверено 25 марта 2016 .
  15. ^ «16.1. Os - Различные интерфейсы операционной системы - Документация Python 3.5.1» . docs.python.org . Проверено 25 марта 2016 .
  16. ^ " " Безопасные "случайные числа в PHP" . Что за Daily WTF? . 18 апреля 2010 г.
  17. ^ «PHP: openssl_random_pseudo_bytes - Руководство» . php.net . Проверено 25 марта 2016 .
  18. Levine, John R., Ed .: Internet Secrets , Second edition, page 831 ff. Джон Вили и сыновья.
  19. Schneier, B: Applied Cryptography , Second edition, page 233 ff. Джон Вили и сыновья.
  20. ^ Берр, МЫ; Додсон, Д. Ф.; Полк, WT (2006). «Руководство по электронной аутентификации» (PDF) . NIST. DOI : 10,6028 / NIST.SP.800-63v1.0.2 . Цитировать журнал требует |journal=( помощь )

Внешние ссылки [ править ]

  • Криптографически безопасное случайное число в Windows без использования CryptoAPI из MSDN
  • RFC 4086 по рекомендациям случайности для безопасности (заменяет более ранний RFC 1750. )