Криптография: практика
Вычеркнутые вопросы перенесены в FAQ
Парольную фразу какой длины имеет смысл использовать в программах шифрования?
Многие программы используют стандарт PBKDF2, который обеспечивает замедление атак словарного перебора, за счёт многократного хэшированию с солью. Многократное хэширование даёт замедление проверки каждого пароля. Т.н. "соль" (случайно сгенерированная открытая строка) используется для предотвращения использования заранее просчитанных таблиц ключей из паролей.
Если даже не рассматривать эти меры противодействия словарным атакам, то для самых консервативных оценок нужно исходить из 128-битной стойкости пароля.
Т. е. pn должно быть примерно равно 2128, где p — количество символов во множестве для случайного выбора, из которого составлен пароль, n — длина пароля.
Например 2727 ≈ 2128 — если можно запомнить абсолютно случайный набор из двадцати шести букв с клавиатуры + пробел, длиной также из 27 символов.
Энтропию одного символа можно посчитать, решив уравнение 2x=N, где N это количество символов в алфавите:
x = log2(N) = ln(N)/ln(2)
Умножив эту величину на количество символов в пароле, легко рассчитать его общую энтропию.
На практике проще всего запомнить 10 случайно выбранных слов из специально подготовленных словарей коротких слов Diceware, что даст 128-битный уровень. Слова можно связать во фразу для лёгкого запоминания, главное не использовать известные фразы, не подгонять порядок слов под естественный.
Для оптимизации простоты запоминания можно уменьшать число слов, но увеличивать число дополнительных символов, сверяя получаемое значение энтропии пароля с формулой.
См. также Современная техника взлома паролей, Выбор и защита паролей, Фонетический пароль
А насчёт того, что лучше – употреблять спецсимволы или удлинять пароль, так это вопрос личных предпочтений и вкуса, если следовать данным выше рекомендациям.
И как показано выше, обязательное использование спецсимволов не ослабляет пароль, даже если об этом противнику известно заранее. А вам очевидно, что ослабляет? Причём настолько очевидно, что вы даже не хотите с этим спорить? Я правильно излагаю вашу позицию?
комментариев: 11558 документов: 1036 редакций: 4118
комментариев: 11558 документов: 1036 редакций: 4118
В силу трудности запоминания криптостойкого пароля и невозможности его частой смены без записывания куда бы ни было, он используется мною только как главный пароль, то есть с единственной целью доступа к программе управления другими криптостойкими паролями, которые я никогда не запоминаю и периодически меняю.
При построении главного пароля я использую три ограничения:
1) битность пароля не должна быть менее 128;
2) длина пароля не должна быть более 64 символов (это ограничение обусловлено лимитом длины пароля в используемой мою программе шифрования ТруКрипт);
3) в пароле используются только символы a-z, A-Z и 0-9 (почему – хорошо описано знающими людьми выше по ветке).
Запоминание пароля состоит из нескольких последовательных этапов. В идеале было бы разнести по времени полное запоминание пароля и его использование, но я этого не делаю и запоминаю его параллельно с использованием при условии более полного соблюдения первого ограничения на всех этапах.
Итак, начнем. Как же действительно запомнить высокорандомный пароль? Я начал с того, что сформировал простой нестойкий пароль, который я никогда не забуду, и методом повторения довел его теоретическую битность до необходимого уровня. Пароль был построен по примитивному алгоритму (навеянному «секретными вопросами» почтовых серверов) из слияния двух английских слов («название любимой рок-группы») и шести цифр («почтовый индекс родителей») и выглядел так:
deeppurple127025
Ориентировочная битность этого пароля 60 бит.
Четырехкратное его повторение обеспечивает 81 бит и укладывается во второе ограничение.
deeppurple127025deeppurple127025deeppurple127025deeppurple127025
Я не знаю, какова практическая стойкость этого пароля для брутфорса, да это и не важно. На втором шаге я генерирую высокорандомный криптостойкий пароль из 21 символа битностью в 120 бит:
IueJZnc0Vk1dfpktUrvBD
и разбиваю его на 7 групп по 3 знака (можно иначе в зависимости от возможностей памяти).
1) Iue
2) JZn
3) c0V
4) k1d
5) fpk
6) tUr
7) vBD
Теперь добавляю первую группу символов к своему незабываемому паролю и получаю такой шаблон:
Iuedeeppurple127025
Битность только этого шаблона уже составляет 79 бит, но его четырехкратное повторение составит более 64 символов и «хвост» будет обрезан ТруКриптом. Это плохо, потому что я в итоге обязательно собьюсь и забуду свой пароль. Поэтому я ограничиваюсь троекратным повтором и получаю пароль из 57 символов и 104 бит.
Iuedeeppurple127025Iuedeeppurple127025Iuedeeppurple127025
Этим паролем я шифрую том ТруКрипт и свою базу паролей на нем и использую его до тех пор, пока он не станет для меня «незабываемым». Конечно же, в первое время я его записываю куда-нибудь на бумажку или пачку сигарет. Но не весь, а только Iue. Что это за Iue никто никогда не догадается, как никогда не узнает и используемого мною первоначального шаблона и алгоритма.
На втором этапе добавляется вторая группа символов и том ТруКрипт вместе с базой паролей перешифровывается новым паролем. Тут снова возникает нюанс. Длина шаблона теперь составляет 22 символа, и утроить его уже не получится. Поэтому я его удваиваю и получаю главный пароль длиною 44 символа и битностью 117 бит.
IueJZndeeppurple127025IueJZndeeppurple127025
Вторую группу символов мне тоже вначале приходится записывать, но, опять же, только ее одну.
И вот уже на третьем этапе я получаю гораздо более рандомный пароль из 50 символов с битностью 137 бит.
IueJZnc0Vdeeppurple127025IueJZnc0Vdeeppurple127025
Добавление четвертой группы обеспечивает мне невзламываемый пароль из 56 символов и 149 бит, который я держу только в своей «оперативной памяти» и никогда не позабуду.
IueJZnc0Vk1ddeeppurple127025IueJZnc0Vk1ddeeppurple127025
Пятая группа дает 62 символа и 159 бит.
IueJZnc0Vk1dfpkdeeppurple127025IueJZnc0Vk1dfpkdeeppurple127025
Добавление шестой группы отнимает возможность удвоить шаблон, поэтому первоначальный простой пароль отбрасывается вовсе и получается утроенный пароль из 54 символов и 143 бит.
IueJZnc0Vk1dfpktUrIueJZnc0Vk1dfpktUrIueJZnc0Vk1dfpktUr
В итоге после добавления седьмой группы символов я получаю незабываемый высокорандомный пароль из 63 символов с битностью в 163 бита.
IueJZnc0Vk1dfpktUrvBDIueJZnc0Vk1dfpktUrvBDIueJZnc0Vk1dfpktUrvBD
Естественно, алгоритм добавления групп может быть совершенно другим.
В идеале конечно нужно будет отказаться от удваиваивания и запомнить абсолютно рандомную единичную комбинацию. Но это в идеале и если в этом возникнет необходимость.
комментариев: 9796 документов: 488 редакций: 5664
Предположим слово взято рэндомно из словаря всех популярных слов размером 300000 (туда муз. группы влезут), ну и число соответствующее: 300000 · 127025 = 38107500000, что соответствует примерно 235.
А дальше:
a · 2n = 2(n + a)
Само по-себе удваивание добавляет два бита, утраивание — три.
А принцип запоминания сложного пароля по частям имеет право на использование (но не при доступе к удалённым зашифрованным данным).
screenshot
комментариев: 11558 документов: 1036 редакций: 4118
комментариев: 11558 документов: 1036 редакций: 4118
Нет. Что Вас наводит на такую мысль?
Итак, как было правильно отмечено в теле топика, pn = 2128 ⇒ количество символов в пароле n, написанном в алфавите длиной p, для достижения 128-битной энтропии должно быть
Количество символов: 26 ⋅ 2 = 52 — английский алфавит. Количество спецсимволов (вместе с пробелом) — 43, вот они все:*
В частности, они могут быть получены из вывода команды**
*Проверьте, что 1) никакие спецсимволы не забыты, и 2) в приведённой строке нет символов, упомянутых более одного раза. Пока считал, успел раз 10 ошибиться, поэтому перепроверяйте.
**Не знаю, насколько pwgen можно доверять. Он /dev/random или /dev/urandom использует? Скорее второе. И цитата из мана «Include at least one special character in the password» меня смущает. Надо же не «at least one» включать, а просто использовать спецсимволы наравне с другими символами парольного алфавита.