28 December 2009

Как запомнить кучу безопасных паролей, и не сойти с ума

Lumber room
Коллега тут просил поделиться моей схемой «паролирования», т.е. придумывания удобно запоминаемых (или вспоминаемых) паролей. Поскольку это фактически значит раскрыть значительную часть фишки моих паролей, что сделает их очень уж уязвимыми, решил доработать схему с учетом того, что мне не понравилось по результатам довольно длительного использования (более полугода, пожалуй).
Дабы при виде картинки вроде этой
вы не становились похожи на этого мужика
image image
Читайте топик дальше.

Зачем?


Преимущества схемы паролирования над менеджером паролей как принципа:
  • отсутствие необходимости в специальном софте;
  • как следствие, мобильность и независимость от файлов;
Недостатки:
  • требует некоторой подготовки к использованию (ниже — подробнее);
  • требует умственного напряжения при создании и вспоминании пароля.
Я знаю, что особые умники скажут, что менеджер паролей может быть portable и на флешке, которая всегда с собой. Но он вряд ли может быть кросплатформенным, не требующем никакой настройки случайного компа и защищенным от утери флэшки.
Отличия от других схем создания паролей:
  • детерминированность (строгий закон создания паролей; может быть как недостатком, так и преимуществом);
  • хм. Нет, больше отличий от тех схем, что я видел, на ум не приходит.
Итак, вопрос «зачем?» считаем решенным и решительно отброшенным.

Disclaimer


Схему предполагается пользовать для генерирования паролей на всю кучу веб-сервисов (в первую очередь именно их, почему — ниже), которые не имеют принципиальной важности, но теми людьми, которые серьезно подсели на инет и не хотят пасть жертвой виртуальной вражины или мошенника, который может обрушить всю вашу виртуальную жизнь, узнав один пароль, ибо вы не соблаговолили пользоваться ни менеджерами паролей, ни схемой паролирования. Т.о., на очередную левую социалку, форум и бложик — пойдет, а вот на почту или webmoney надо генерить хотя бы по той же схеме, но с другим «ключом». Вполне очевидно.
Да и вообще схема создания паролей эффективна, пока о ней никто не знает. Индивидуальна и трудно узнаваема. Так что maybe I'm doing a mistake. Теперь все мои пароли похитят!11
Также следует учесть, что в современных компьютерных технологиях защиты наиболее слабым звеном является человек, то есть вы, пользователь этих паролей. Всевозможные лохотроны и фишинг-сайты наполнили интернеты, так что, какой бы крутой пароль у вас ни был, вам надо еще не слить его прямо в руки злоумышленнику. Ну и, опасаться терморектального криптоанализа.
Еще, я не являюсь специалистом по криптографии или подобному, и если кто-то знает, почему предлагаемая схема плоха, как ее улучшить — милости прошу в комменты. Меня действительно интересует мнение хакера/специалиста по защите, в крайнем случае — киньте ссылкой на не очень сложную для освоения литературу (за плечами основы матана, линейки и тервера, хотя не претендую на действительно хорошее знание предметов, последний из названных я на 90% забыл).
Также, я не являюсь вундеркиндом, но так же и не считаю, что описываемый способ генерации настолько сложен, что им некомфортно пользоваться. В конце концов, я никого не агитирую.
Понять сразу может быть не очень просто, но вы хотя бы начало почитайте — может, идея покажется стоящей.

Общие сведения о паролях


Этот раздел можете пропустить, если и так знаете, каков должен быть нормальный пароль.
А он должен быть таким:
  • состоять из заглавных и строчных латинских (и только их) букв, цифр и спецсимволов (не стоит злоупотреблять, на мобильных устройствах траблы со вводом будут)
  • иметь длину от 8 символов, что обеспечивает хрен пойми что, но вариантов пароля теоретически будет (26*2 (буквы строчные и заглавные) + 10 (цифры) + 10 спецсимволы (те, которые в английской раскладке на цифрах в qwerty)) ^ 8 = (72)^8 = 722204136308736 = 722 * 10^12 вариантов. цифра впечатляет, однако реальной инфой о «вскрываемости» такого пароля в реальных условиях я не обладаю.
Далее

Дополнительные требования, на основе которых строится данная схема паролирования


Вот они:
  • пароль должен «вспоминаться» путем каких-либо хитрых и никому кроме вас неизвестных, но достаточно простых для осуществления при каждодневном логине не на один сервис, операций. По сути эти операции будут операциями по расшифровке, и ключ может быть как открытым, так и закрытым. Наиболее удобным открытым ключом шифрования представляется доменное имя веб-сервиса. Закрытым — какая-либо хитромудрая ассоциация образа с данным сервисом (только очень уж она недетерминирована получается, сложно вспоминать.) Поэтому берем открытый ключ, а подробнее об этом — ниже.
  • при получении злоумышленниками пароля (и даже не одного, а штук, скажем 10 — при парольной базе средне-активного юзера интернетов в 100 пассвордов это 10%) они не должны смочь узнать последовательность, правила, желания вашей левой пятки и все прочее, что вы использовали для генерации аналогичных паролей к другим сервисам. Подробнее — опять же ниже.
  • ну и само собой, совпадений (по крайней мере, умышленных) быть не должно. Генерить пароли надо уникальными. Если уж не повезло — то бог с ним, совпадение 1 пароля из 100 с другим из 100 не считаем критичным.

Идея


Так вот. Что у нас предстает наиболее общим и доступным идентификатором веб-сервиса? Правильно — доменное имя. Рассмотрим какой-нибудь не очень далекий от жизни пример.
Собрались вы поиграть в Warhammer Online по случаю безлимитного триала. Ну, надо регистрироваться. Пройдя по какой-то там ссылке где-то на сайте попадаете вы на страницу с адресом вроде
https://accounts.eamythic.com/war/trial
Ну и на ней вводите всю регистрационную инфу, в т.ч. и пароль. Вот пароль и генерим: берем, например, число символов в каждой части доменного имени, отделенной точкой, складываем (8 + 8 + 3 = 19), получаем первые 2 символа пароля. Дальше берем либо осмысленную фразу, которая у вас будет четко ассоциироваться с этой игрой («Warhammer», например; сие не является хорошим вариантом, т.к. осмысленность в пароле — зло), либо постоянный надежный восьмизначный пароль, который вы предварительно заучили и сможете назвать даже будучи разбуженными в 3 часа ночи (пусть будет JE82adw] ).

Генерим например так:
19 8 JE 8 82 ad 3 w]
Т.е. первые 2 цифры — сумма числа символов в первой, второй и третьей части доменного имени (до точки, между двумя точками, после точки). На второй позиции — число символов в первой части доменного имени, на третьей — 2 символа из нашего заготовленного пароля, на четвертой — вторая часть доменного имени, ну, я думаю, суть вы поняли. Получили 13-значный пароль, из которых 8 символов мы и так заботали, а остальные 5 получаются из доменного имени. В общем суть в том, что в один и тот же ваш пароль вы вставляете куски, которые получаете дешифровкой легкодоступной инфы. Ясное дело, что в явном виде использовать доменное имя — большое палево, кодировать, например, l33t'ом — тоже словарем подбирается, посему нужно изощряться (хотя, коль скоро пароль не является полностью l33t-кодированным, как составляющие применять, я считаю, можно). В общем, закон шифрования — какой хотите. Хотите — в степень возводите, хотите ищите разность между числом 100 и длиной названия веб-сервиса — что угодно. Хоть длину трехмерного вектора из длин 3 частей доменного имени ищите. Что важно — так это то, чтобы выбранный вами закон был одинаков для всей «серии» сервисов. Пусть будет для помоек один, для рядовых — другой, для важных — третий. Но вы должны четко знать где какой, иначе потом придется ради каждого логина восстанавливать пароль.

Важная мысль, до которой я дошел лишь в процессе описания схемы


Такая схема теряет смысл при получении нескольких паролей из одной серии. По двум паролям находится общая подпоследовательность, и это уже больше половины пароля. Закон найти тоже не тяжело. Да даже если он не найден — зная места, на которых должны быть цифры, и зная, что там лишь цифры, подобрать его становится очень просто.
Здесь варианты — либо дробить пароли на группы, в пределах которых будет одинаковая постоянная часть, либо создавать шифруемую часть такой, что даже после узнавания постоянной части пароли остается сложно подобрать, либо еще дробить на группы, в пределах которых будет одинаковый закон шифрования. Если шифруемая часть будет тоже безопасна (8 символов, хотя бы буквы/цифры) — то это уже снижение безопасности при получении 2 паролей только (условно) в 2 раза (я знаю, что от длины пароля сложность его подбора зависит не линейно). А лучше объединить эти 3 варианта вместе.

Итоговый вариант


Таким образом, надо:
  • завести несколько категорий паролей, примерно равных по объему, и таких, что понять вам, какой пароль из какой категории, не составит труда. В пределах категории одна константная часть и один закон шифрования (можно и сильнее дробить, но тогда есть шанс свихнуться). Если паролей мало и заморачиваться влом — пусть категория будет одна, но вы предупреждены выше.
  • для каждой категории придумать постоянную часть пароля. Пример: профессиональная деятельность — постоянная часть m2f~(kJB; социальные сети — постоянная часть 5O((eT!1;
  • для каждой категории придумать закон шифрования. Пример: профессиональная деятельность — закон шифрования — в начало и конец первый и последний символы доменного имени и число символов в каждой части доменного имени; социальные сети — закон шифрования — в начало — число символов в первой части доменного имени, в середину — во второй, в конец — в третьей, и в конец первые 2 символа доменного имени, идущие прямо перед точкой, в обратном порядке;
  • понять, что такие пароли удобно вводить так: сначала постоянная часть, затем шифруемые добавления к ней (перемещая курсор в нужные места);
  • начать пользоваться схемой. Пересилить себя и начать генерировать пароли. Первое время, возможно, придется их восстанавливать, но менять нужно опять же на тот, который должен быть по схеме. Примеры пароля с означенными выше постоянными частями и правилами шифрования: habrahabr.ru (профессиональная деятельность) — h92m2f~(kJBu92; vkontakte.ru (социальные сети) — (первой части доменного имени нет, считаем ее www) 35O((9eT!12et; facebook.com (социальные сети) — 35O((9eT!13ko.

Результаты


Получаем:
  • нужно запомнить столько паролей, сколько у вас категорий веб-сервисов, и столько же законов генерирования. Я полагаю, это число будет точно меньше десятка, а скорее всего — 4-5. 5 восьмизначных паролей и сопутствующих законов генерирования считаю вполне возможным запомнить;
  • каждый отдельный пароль очень устойчив к подбору;
  • при получении множества паролей одной группы и определенной их обработке (т.е. понимания, почему на определенных местах стоят определенные символы) можно сгенерить все остальные пароли этой группы. Сгенерить получится после получения 2-3 паролей, если хакер не имбецил. То есть требование к устойчивости остальной схемы при получении части паролей выполняется совсем не полностью, но, как минимум все пароли остаются неизвестными при узнавании стольких паролей из разных групп, сколько есть этих групп, а далее — «взламываются» по очереди группы, но не весь банк паролей сразу.
  • использовать такую схему для не-веб-приложений сложнее ввиду, как правило, неоднозначности названия того, куда надо ввести пароль. Если это веб-сервис — вы поднимаете глаза на адресную строку и видите его доменное имя. Если это, например, ключ шифрования флэшки — с семантической привязкой куда сложнее;
  • закон генерирования ниэпически сложный! Автор, убейся!11 На самом деле, я использую куда более простые законы. А тут — для примера возможностей, для параноиков, и для тех, кто скажет, что все это очень легко взломать.
Спасибо тем, кто дочитал до конца.
Надеюсь, пост был вам полезен, милости прошу в обсуждение.
P.S. Если сочтете пост нужным — перенесу в подходящий блог.
Tags:паролибезопасностьсхема паролирования
Hubs: Lumber room
-4
1.9k 3
Comments 28